Запись структурного указателя в файл с помощью fwrite - PullRequest
0 голосов
/ 25 февраля 2011

Я пытаюсь записать указатель на структуру файла. Я пытаюсь написать структурный указатель на символьный буфер, затем извлечь указатель из буфера и, наконец, записать всю структуру в файл.

Вместо записи всей структуры я получаю ненужные данные в файле.

Я что-то упустил в коде или сделал какую-то ошибку.

Полная вставка моего тестового кода.

#include <stdio.h>
# include<stdlib.h>
#include <string.h>
typedef struct dummy_s {

  int a;
} dummy_t;

void main(int argc, char* argv)
{


   char *s1;
   s1 = malloc(sizeof(dummy_t)*1000);
   dummy_t * tmp1;
   tmp1 = (dummy_t *)s1;
   tmp1 -> a = 100;
   FILE *f;
   f = fopen("dummyfile.txt","w");
   dummy_t * tmp = NULL;
   tmp = malloc(sizeof(dummy_t));
   memcpy(tmp, s1, sizeof(dummy_t));
   fwrite(tmp,sizeof(struct dummy_s),1,f);
   fclose(f);
}

[Отредактировано для ошибок компиляции - Извините] ура! Naren

Ответы [ 2 ]

1 голос
/ 25 февраля 2011

Извините, но я буду немного груб.Если вы публикуете фрагмент кода, убедитесь, что он правильно компилируется.В вашем коде используется переменная "d", которая не определена, она принимает "sizeof dummy" (и я не вижу здесь пустышки, по крайней мере, в коде), и в ней отсутствует куча #include:s.

Когда исправлены ошибки компиляции (с использованием tmp1 вместо d), похоже, что он работает правильно.Обратите внимание, что генерируемый вами «текстовый файл» содержит двоичное представление структуры, а не текстовое.(Предполагается, что 32-битная машина с прямым порядком байтов вы бы получили байт со значением 100, за которым следовали бы четыре значения 0).

Кроме того, я не вижу необходимости в последнем malloc и memcpy, fwrite должновозможность выписывать содержимое исходного массива напрямую.

0 голосов
/ 25 февраля 2011

Вы хотите записать структуру в виде текста или двоичного файла в файл?

Если вы хотите записать его как текст, сначала преобразуйте свой номер в текстовое представление, используя sprintf, например,

char buf[100];
sprintf (s, "%d", tmp->a);

Затем запишите buf в файл, используя fputs.

Если вы хотите создать бинарный файл, обязательно откройте файл не с «w», а с «wb». В противном случае среда выполнения может преобразовывать определенные символы в другие символы (например, перевод строки становится переводом строки + перевод строки). 'B' в "wb" говорит fopen, что вы хотите записать файл в двоичном виде, не выполняя никаких преобразований символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...