2016-01-05 12 views
0

Я использую fstream для записи целого числа в двоичный файл.Проблемы с написанием целого числа в двоичном файле C++

int main(){ 

fstream f1; 
int num = 2, num2 = 0; 

f1.open("dat1", ios::app | ios::out | ios::in | ios::binary); 

f1.write((char *)num, sizeof(int)); 
f1.seekp(0); 
f1.read((char *)num2, sizeof(int)); 

cout << num2; 

} 

Проблема заключается в строке f1.write. Я могу писать в двоичный файл массива, но когда я пытаюсь написать только один блок ИНТ дает мне ошибку:

Необработанное исключение в 0x522C7EA6 (msvcp120d.dll) в Project.exe: 0xC0000005: чтение нарушение прав доступа местоположение 0x00000002.

Я не понимаю, в чем проблема.

ответ

4

Вам нужно это:

f1.write((char *)&num, sizeof(int)); 
f1.seekp(0); 
f1.read((char *)&num2, sizeof(int)); 

write() и read() хотите указатель, где ваши данные.

int num = 2; 

Использование (char *)num преобразует num в указатель, ссылающийся на адрес 0x00000002.


Кроме того, при работе с бинарными файлами (кроме тестирования) всегда лучше включать в себя заголовок, который должен содержать по крайней мере следующее:

  • A Magic Number (обычно 4 байта) , поэтому точный тип файла может быть определен или проверен независимо от того, каким может быть расширение.

  • Номер версии, который позволит вам расширить формат и структуру вашего файла в будущем, не нарушая ваш текущий формат.

  • Как уже указывалось, Byte Order Mark, который позволит корректно считывать ваши данные на всех платформах (мало-по-английски).

2

Линия должна быть на самом деле:

f1.write((char *)&num, sizeof(int)); 

Вам нужен адрес в качестве аргумента функции write. Отъезд http://www.cplusplus.com/reference/ostream/ostream/write/.

+3

Также необходимо учитывать байт, чтобы использовать файл независимо от платформы, если это необходимо. – frast

0

write want's a array. Это означает начальный адрес. (char *)num преобразует число в адрес и укажет на то, что вы не хотите. Используйте &num, чтобы получить адрес num. Может быть, сделать литье с (char*) тоже.

5

Вы должны бросить адрес из num в char*, не num себя. Фактически, поведение использования результата (char*)num составляет undefined, который объясняет крах.

Использовать вместо f1.write((char *)&num, sizeof(num));. Аналогично измените f1.read.

Я также изменил аргумент sizeof: Я предпочитаю этот стиль, поскольку он в будущем доказывает вам, что вы не изменяете тип. Двигаясь дальше, вы должны будете рассмотреть endianness, если вы пишете и читаете на разных платформах (например, Windows и Linux).