2010-03-04 8 views
2

Я посмотрел на двоичные чтения и записи объектов в C++, но у вас есть некоторые проблемы. Он «работает», но, кроме того, я получаю огромное количество ошибок/«info».Ошибка двоичного чтения/записи во время выполнения

Что я сделал это

Person p2; 

std::fstream file; 
file.open(filename.c_str(), std::ios::in | std::ios::out | std::ios::binary); 
file.seekg(0, std::ios::beg); 
file.read ((char*)&p2, sizeof(p2)); 
file.close(); 
std::cout << "Name: " << p2.name; 

Человек простой структура, содержащая string name и int age. Когда я запускаю программу, он выводит «Имя: Боб», так как я уже сделал программу для записи в файл (так что объект уже находится в имени файла).

В дополнение к выводя имя он также выводит:

* Glibc обнаруженную * программы: двойной бесплатно ог коррупции (fastttop): ***

трассировку:

...

Карта памяти:

...

Abort

+1

Не перепечатывайте код, он может ввести ошибки. __Cut и Paste__. Двоичное чтение/запись объекта будет работать, только если структура не содержит указателей. Это правило должно быть рекурсивно применено ко всем членам.Поэтому, если член или член-член участника или члены-члены является указателем, это сломается. С дополнительной информацией о Человеке сложно сказать, действительно ли это будет работать. –

+0

Покажите нам декларацию Личности. – 2010-03-04 13:56:25

+0

Помните, что компилятору разрешено вставлять дополнения между полями в структурах, классах и объединениях. Другая проблема заключается в том, что для строк обычно требуется пространство, выделенное для них, чтение в это пространство, а затем назначение структуры *, если текстовое поле не является фиксированным размером *. –

ответ

3

Является ли строка имени в структуре Person символьным массивом или строкой STL? Вы не можете заполнить STL-строку бинарными данными чтения поверх нее, так как формат данных не является сериализуемым (содержит указатели)

0

Либо p2.name - это символ *, и вы пишете и читаете значение указателя , а не то, что указывается им. Или p2.name - более сложный тип, такой как std :: string, который использует внутренние указатели с той же проблемой.

Сериализация классов часто требует больше работы, чем просто сброс представления памяти.

+0

, но если это имя символа [100], это, вероятно, сработает. –

0

Вы сказали, что создали объект Person в файл. Вы пытались использовать инструмент дампа, чтобы узнать, что вы видите в файле, что вы ожидаете?

Также вы пытались вместо использования строки использовать обычный символ (как указывал @bdk)?

1

Было бы интересно посмотреть, как вы также записываете информацию в файл, а также как строится структура Person.
Если у вас нет проблем с тем, что файл является простым текстом, моим предложением было бы записать в файл, используя string::c_str() (который возвращает const char *), а также используя itoa() или itoa_s(), чтобы получить целое число в виде char * ,

Вы также можете иметь один или несколько конструкторов в лицо:

Person(const std::string& name, int age); 
Person(const char* name, int age); 

тогда, когда вы извлечь данные из файла, просто вызовите конструктор с этими данными.

0

При использовании двоичного ввода-вывода размер должен быть исправлен. Если вы используете STL-строку здесь, это будет проблемой, поскольку размер строки STL является произвольным.

Смежные вопросы