Большой Воронежский Форум
» Программирование>fwrite()
xxx-men 11:42 14.10.2009
пишу в бинарный файл данные.
единственный на весь проект вызов функции записи выглядит так: fwrite(data,4,4,f);
на выходе получаю мусорные байты:
Код:
seg000:00000000                 struct_0 <0, 0, 0, 185A1E7Dh> // структура 16 байт
seg000:00000010                 struct_0 <1, 0, 0, 0E66592Fh>// мои данные
seg000:00000020                 struct_0 <2, 0, 0, 57B405EBh> //
seg000:00000030                 struct_0 <3, 0, 0, 11184A1Ch>
seg000:00000040                 struct_0 <4, 0, 0, 26E83A29h>
seg000:00000050                 struct_0 <5, 0, 0, 746F31BFh>
seg000:00000060                 struct_0 <6, 0, 0, 56605FE6h>
seg000:00000070                 struct_0 <7, 0, 0, 1F807E24h>
seg000:00000080                 struct_0 <8, 0, 0, 63483829h>
seg000:00000090                 struct_0 <9, 0, 0, 31827771h>
seg000:000000A0                 db  0Dh <-------------------------------откуда это?
seg000:000000A1                 struct_0 <0Ah, 0, 0, 27F66F7Bh>
seg000:000000B1                 struct_0 <0Bh, 0, 0, 71FD2BD5h>
seg000:000000C1                 struct_0 <0Ch, 0, 0, 3CD01EA6h>
seg000:000000D1                 struct_0 <0Dh, 0, 0, 3654665Bh>
seg000:000000E1                 struct_0 <0Eh, 0, 0, 4A330B78h>
seg000:000000F1                 struct_0 <0Fh, 0, 0, 44685CEEh>
seg000:00000101                 struct_0 <10h, 0, 0, 0D5D4155h>
seg000:00000111                 db  0Ah <-------------------------------откуда это?
seg000:00000112                 struct_0 <11h, 0, 0, 9A0A0D02h>
seg000:00000122                 db  5Eh <-------------------------------откуда это?
seg000:00000123                 struct_0 <12h, 0, 0, 2FC00CE4h>
seg000:00000133                 struct_0 <13h, 0, 0, 3E5C47F5h>
seg000:00000143                 struct_0 <14h, 0, 0, 0F28647Dh>
....
seg000:000003B3                 struct_0 <3Bh, 0, 0, 63826E7Fh>
seg000:000003C3                 struct_0 <3Ch, 0, 0, 7F4C259Ch>
seg000:000003D3                 struct_0 <3Dh, 0, 0, 0A0D79D4h>
seg000:000003E3                 db  7Ah <-------------------------------откуда это?
seg000:000003E4                 struct_0 <3Eh, 0, 0, 26E83A13h>
seg000:000003F4                 struct_0 <3Fh, 0, 0, 1AA219D7h>
seg000:00000404                 struct_0 <40h, 0, 0, 5FE763FBh>
seg000:00000414                 struct_0 <41h, 0, 0, 38656540h>
seg000:00000424                 struct_0 <42h, 0, 0, 2FC00CB4h>
....
что я делаю не так? [Ответ]
MadFish 12:04 14.10.2009
fopen() покажи часом не как текстовый файл открыл? 0Dh 0Ah похоже на ентер под масдаем
ну и выравнивание структур на границу байта для пущей уверенности сделать бы надо
[Ответ]
xxx-men 12:10 14.10.2009
f = fopen("log.bin","w");

Сообщение от MadFish:
ну и выравнивание структур на границу байта для пущей уверенности сделать бы надо

это еще что? [Ответ]
MadFish 12:16 14.10.2009
ыыыы
fopen("log.bin","wb");

Выравнивание структур данных компилятор имеет право делать как ему заблагорассудится, в частности может даже внутрь структуры между элементами впихивать мусор например чтобы объект попадал целиком в одну строку кеша. в итоге в двоичный вывод этот мусор может попадать. [Ответ]
cfyx 12:21 14.10.2009
MadFish, +1, "wb" не помешает.
и прагма pack (push, 1) / (pop) тоже. хотя если писать по одной записи и не пользоваться sizeof, то можно и так ) [Ответ]
xxx-men 12:27 14.10.2009
"wb" помогло.

Сообщение от MadFish:
Выравнивание структур данных компилятор имеет право делать как ему заблагорассудится, в частности может даже внутрь структуры между элементами впихивать мусор

в оригинале у меня не структура а массив из DWORD, это я просто лог так показал. [Ответ]
Вверх