Запись структурных переменных в файл, проблема - PullRequest
0 голосов
/ 14 сентября 2011

Привет, я должен записать содержимое структурной переменной в файл.У меня есть рабочая программа, но вывод выглядит искаженным, вы можете понять, когда вы посмотрите на вывод.Простая версия кода приведена ниже, и выходы следующие.

Код:

#include<stdio.h>
#include <stdlib.h>

struct mystruct
{
 char xx[20];
 char yy[20];
 int zz;
};

void filewrite(struct mystruct *myvar)
{
   FILE *f;

   f = fopen("trace.bin","wb");
   if (f == NULL)
   {
     printf("\nUnable to create the file");
     exit(0);
   }

   fwrite(myvar, sizeof(struct mystruct), 1, f);
   fclose(f);

}


void main()
{
    struct mystruct myvar = {"Rambo 1", "Rambo 2", 1234};

    filewrite(&myvar);

}

Выход:

(1. Где целое число?1234 '? Мне нужно это целое.)

(2. Почему здесь появляется какой-то случайный символ?)

trace.bin

Rambo 1Rambo 2Ò

Ответы [ 3 ]

8 голосов
/ 14 сентября 2011

Ваша программа верна и вывод тоже ...

Вы пишете двоичный файл, содержащий необработанные данные из памяти.Целое число zz записывается на диск в виде 4 байтов (или 2 в зависимости от размера целого числа в вашей системе), причем сначала идет младший байт (думаю, машина Intel).

1234 (десятичное число) записываетсякак 0xD2, 0x04, 0x00, 0x00 на диск.0xD2 это Ò, когда вы смотрите в текстовом виде.0x04 и 0x - непечатаемые символы, поэтому они не отображаются.

2 голосов
/ 14 сентября 2011

Во-первых, обычно не рекомендуется копировать неупакованные struct-типы в файлы, так как компилятор может добавить заполнение в структуру, чтобы выровнять ее в памяти.Таким образом, вы получите либо непереносимую реализацию, либо какой-то искаженный вывод, когда кто-то другой попытается прочитать ваш файл, а биты / байты не будут размещены с правильным смещением из-за байтов заполнения компилятора.* Во-вторых, я не уверен, как вы читаете свой файл обратно (кажется, вы просто скопировали его в буфер и попытались его распечатать), но последний набор байтов имеет тип int в конце ...она не будет строкой с нулевым символом в конце, поэтому способ ее печати не будет выглядеть «правильным» ... печать строк с нулевым символом в конце, так как строки могут также привести к переполнению буфера, что приведет к ошибкам сегментации и т. д.1004 *

Чтобы прочитать содержимое файла в удобочитаемом формате, вам необходимо открыть файл и прочитать содержимое обратно в правильные структуры данных / типы, а затем соответствующим образом вызвать printf илинекоторые другие средства преобразования двоичных данных в данные ASCII для распечатки.

1 голос
/ 14 сентября 2011

Я не рекомендую выгружать память напрямую в файл, вам следует использовать какой-либо метод сериализации (например, если у вас есть указатель в структуре, вы обречены). Я рекомендую Протокол Google Buffers , если данные будут использоваться несколькими приложениями.

...