Страницы

Поиск по вопросам

вторник, 30 октября 2018 г.

Лишний байт при записи структуры в файл

Откуда берется лишний байт?
#include #include #include
#pragma pack(push, 1) typedef struct { int a; float b; } structEx; #pragma pack(pop) using namespace std; int main() { { structEx x; x.a = 2; x.b = 4.2; ofstream fout("Text1.txt"); for (int i = 0; i < 10; i++) { x.a += 3; x.b += 0.5; fout.write((char *)&x, sizeof(x)); } fout.close(); } { structEx x; x.a = 2; x.b = 4.2; ofstream fout("Text2.txt"); for (int i = 0; i < 10; i++) { x.a += 3; x.b += 0.51; fout.write((char *)&x, sizeof(x)); } fout.close(); } return 0; }
Text1.txt при x.b += 0.5;
// 0500 0000 6666 9640 0800 0000 6666 a640 // 0b00 0000 6666 b640 0e00 0000 6666 c640 // 1100 0000 6666 d640 1400 0000 6666 e640 // 1700 0000 6666 f640 1a00 0000 3333 0341 // 1d00 0000 3333 0b41 2000 0000 3333 1341
Text2.txt при x.b += 0.51;
// 0500 0000 52b8 9640 0800 0000 3e0d 0aa7 // 400b 0000 002a 5cb7 400e 0000 0016 aec7 // 4011 0000 0002 00d8 4014 0000 00ee 51e8 // 4017 0000 00da a3f8 401a 0000 00e3 7a04 // 411d 0000 00d9 a30c 4120 0000 00cf cc14 // 41


Ответ

По умолчанию потоки открываются в текстовом режиме (при котором символ
преобразуется в Windows в пару
), так что надо просто вместо
ofstream fout("Text.txt");
написать
ofstream fout("Text.txt", ios::binary);
Компьютер не понимает разницы между бинарными и текстовыми данными - для него все это один поток байтов, а что они означают - ему безразлично. Когда вы открываете файл для записи в текстовом режиме в соответствующей операционной системе, это означает команду "пиши байты как есть, но если встретишь байт 0x0A - запиши пару 0x0D 0x0A". А при чтении - наоборот - "если встретишь эту пару байт - то в память заноси только один 0x0A"

Комментариев нет:

Отправить комментарий