Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Dimaximym
0 / 0 / 0
Регистрация: 04.01.2016
Сообщений: 2
#1

Баг при использовании класса string при записи в бинарный файл - C++

15.05.2017, 00:03. Просмотров 178. Ответов 3
Метки нет (Все метки)

При записи в бинарный файл пользовательского класса, всё отлично отрабатывает, но, если в классе использовался класс string, то в конце выбивает неясное для меня исключение. Подскажите, пожалуйста, что не так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <string>
#include <fstream>
#include <iostream>
using namespace std;
 
class rec {
public:
    string FN;
    int x;
    rec()
    {
    //FN = "NULL";
    }
};
int main()
{
    rec rc, out;
    //rc.x = 4;
    //out.x = 8;
    out.FN = "TESTNOTNULL";
 
    ifstream o_fil;
    ofstream i_fil;
 
    i_fil.open("test.dat", ios::binary | ios::out);
    i_fil.write((char*)&rc, sizeof rc);
    i_fil.close();
 
    o_fil.open("test.dat", ios::binary | ios::in);
    o_fil.read((char*)&out, sizeof out);
    o_fil.close();
 
    cout << out.FN;
 
    system("pause");
    return 0;
}
0
Миниатюры
Баг при использовании класса string при записи в бинарный файл  
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2017, 00:03
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Баг при использовании класса string при записи в бинарный файл (C++):

Ошибка при записи в бинарный файл
Задание - записать в бинарный файл последовательность из N байт вида &quot;00001111...

Ошибка при записи или чтении в бинарный файл
Есть такие вот типы данных: struct Nomer { int n, tsena1Deni; string...

Баг в MinGW при использовании fread
Ну собственно вот простой тестовый код который выполняется некорректно: ...

Ошибка при записи в файл данных из обьекта класса
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;fstream&gt; using namespace...

При обращении к структуре из класса возникает исключение:нарушение прав доступа при записи. Почему?
Структура Test описана в классе ABC: class ABC{ struct Test { int get_i()...

Ошибка при использовании итератора в реализации класса
На скрине всё понятно чо каво. Собственно, что я упустил? Что не дочитал?...

3
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
15.05.2017, 00:11 #2
Лучший ответ Сообщение было отмечено Dimaximym как решение

Решение

Цитата Сообщение от Dimaximym Посмотреть сообщение
Подскажите, пожалуйста, что не так?
Не так то, что std::string, без сериализации, не годятся для бинарных методов записи\чтения. Память под объектом std::string - это не те данные, которые хранит (обычно не в себе) такой объект.
1
Dimaximym
0 / 0 / 0
Регистрация: 04.01.2016
Сообщений: 2
15.05.2017, 00:17  [ТС] #3
То есть придется использовать char*?

Добавлено через 2 минуты
Цитата Сообщение от nd2 Посмотреть сообщение
Память под объектом std::string - это не данные, которые хранит такой объект.
И ещё меня смутило то, что программа правильно перезаписывает в объекте out класса rec переменную FN с TESTNOTNULL в NULL (комментирование в конструкторе класса случайно сделал, забыл убрать перед публикацией)
Тогда почему же уже после system("pause") только вызывается ошибка(скорее после return 0)? Когда вроде бы просто нужно вызвать все деструкторы и всё?
0
nd2
2828 / 2398 / 1052
Регистрация: 29.01.2016
Сообщений: 8,022
15.05.2017, 00:28 #4
Цитата Сообщение от Dimaximym Посмотреть сообщение
То есть придется использовать char*?
Можно сделать сериализацию для std::string/

Добавлено через 10 минут
Цитата Сообщение от Dimaximym Посмотреть сообщение
И ещё меня смутило то, что программа правильно перезаписывает в объекте out класса rec переменную FN с TESTNOTNULL в NULL (комментирование в конструкторе класса случайно сделал, забыл убрать перед публикацией)
Тогда почему же уже после system("pause") только вызывается ошибка(скорее после return 0)? Когда вроде бы просто нужно вызвать все деструкторы и всё?
Это всё UB. Может правильно всё работать, может неправильно, зависит от разного, в том числе и от реализации std::string. Суть проблемы от этого не меняется:
Цитата Сообщение от nd2 Посмотреть сообщение
std::string, без сериализации, не годятся для бинарных методов записи\чтения. Память под объектом std::string - это не те данные, которые хранит (обычно не в себе) такой объект.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2017, 00:28
Привет! Вот еще темы с решениями:

Неопределенная ссылка при использовании шаблонного класса
в проекте 4 файла: CmakeLists.txt, main.cpp, list.h, list.cpp. CmakeLists.txt:...

Ошибки линковки при использовании шаблонного класса
Есть заголовочной файл Utils.h, в котором определены 2 класса String и...

Абракадабра при записи в файл и при чтении из него кириллицы
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main() {...

Бинарный файл, ошибка при чтении символов
Здравствуйте, нужна помощь. Среда MS VS 2013 &quot;Ошибка при чтении символов&quot;,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru