Откуда берется лишний байт?
#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"
Комментариев нет:
Отправить комментарий