Форум программистов, компьютерный форум CyberForum.ru

Считывание строки из файла - C++

Восстановить пароль Регистрация
 
Mikle_Finsky
Сообщений: n/a
09.10.2013, 15:13     Считывание строки из файла #1
Здравствуйте. Есть такой класс (это упрощенный тестовый класс):
C++
1
2
3
4
5
6
7
8
9
class test_string
{
    std::string s;
public:
    test_string(const std::string &t = " ")
        :s(t){}
    std::string GetStr() const {return s;} 
    void SetStr(const std::string &t) { s = t;}
};
Создаю объект от этого класса и записываю его в бинарный файл, потом хочу его считать из этого файла. Но считывать я пытаюсь не обратно в эту же переменную, а через промежуточную (buff). Так как это упрощенная программа (только для того что-бы показать ошибку), но в полноценной программе, все объекты класса test_string хранятся в динамическом массиве (допустим std::vector<test_string>v_str), т.е. при считывание я сначала считываю в буффер, а потом v_str.push_back(buff).
А теперь к проблеме.

Если я при записи и считывание использую одну и туже переменную, то программа завершается корректно и все выводит.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main()
{
    test_string s("Hello, world"), s2;
 
    cout << s.GetStr() << endl;
    cout << s2.GetStr() << endl;
 
    std::fstream io;
    io.open("TEST.dat", std::ios_base::out | std::ios_base::binary);
    io.write((char *)&s, sizeof s);
    io.close();
 
    s.SetStr(" ");
    io.open("TEST.dat", std::ios_base::in | std::ios_base::binary);
    io.read((char *)&s, sizeof s);
    io.close();
 
    cout << s.GetStr() << endl;
        return 0;
}
Если же я использую разные переменные.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    test_string s("Hello, world"), s2;
 
    cout << s.GetStr() << endl;
    cout << s2.GetStr() << endl;
 
    std::fstream io;
    io.open("TEST.dat", std::ios_base::out | std::ios_base::binary);
    io.write((char *)&s, sizeof s);
    io.close();
 
    
    io.open("TEST.dat", std::ios_base::in | std::ios_base::binary);
    io.read((char *)&s2, sizeof s2);
    io.close();
    cout << s2.GetStr() << endl;
То все выводит, но программа завершается некорректно (зависанием), сейчас я не могу предоставить ошибку, т.к. сейчас не имею доступа к MS VS 2012, а VS 2010 Exp ошибку не выводит, а просто просит закрыть программу.

P.S. Я в C++ недавно, но у меня есть такое предположение, что эти два объекта пытаются два раза освободить одно и тоже место в памяти. Но почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2013, 15:13     Считывание строки из файла
Посмотрите здесь:

C++ Считывание строки из файла
считывание строки из файла C++
C++ Считывание строки из файла
Считывание строки из файла. C++
C++ Считывание строки из файла
Считывание строки с файла C++
считывание строки с файла C++
C++ Считывание из файла по номеру строки

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
anmartex
...
 Аватар для anmartex
1699 / 1192 / 494
Регистрация: 12.02.2013
Сообщений: 1,978
10.10.2013, 07:47     Считывание строки из файла #2
Mikle_Finsky, класс test_string, в вашем случае, не является POD структурой, и соответственно следующее является грубейшей ошибкой:
C++
1
2
3
4
5
    // line 10
    io.write((char *)&s, sizeof s);
 
    // line 15
    io.read((char *)&s2, sizeof s2);
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
10.10.2013, 07:59     Считывание строки из файла #3
...
Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно?
Yandex
Объявления
10.10.2013, 07:59     Считывание строки из файла
Ответ Создать тему
Опции темы

Текущее время: 12:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru