2016-02-06 2 views
0

Я пытаюсь скопировать содержимое структуры в список в двоичный файл.Скопировать список в двоичный файл

Вот мои структуры декларации:

typedef struct 
{ 
    char dni[9]; 
    char nombre[100], apellido[100]; 
    double deuda; 
} t_datos; 

struct s_nodo 
{ 
    t_datos dati; 
    struct s_nodo *sig; 
}; 
typedef struct s_nodo *t_nodo; 
void newfile(t_nodo, FILE *); 

В основном я заполнить список с некоторыми данными из файла .dat, и выглядит хорошо, потому что если я распечатать список всех есть ok.I've есть проблема при попытке скопировать структуру i в списке в новый двоичный файл.

//open and copy old binary file to the list... 
fc = fopen("c:\\norep.dat", "w+b"); 
if (fc == NULL) 
{ 
    puts("Error"); 
    exit(-1); 
} 
newfile(lista, fc); 

Вот моя функция:

void newfile(t_nodo lista, FILE *fc) 
{ 
    if (lista != NULL) 
    { 
     fwrite(lista->dati, sizeof(t_datos), 1, fc); 
     newfile(lista->sig, fc); 
    } 
} 

Ошибка я получаю:

error: incompatible type for argument 1 of 'fwrite'|

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

ответ

2

Первый аргумент fwrite() должен быть указатель (const void *быть точным), в вашем случае это не так. Вы должны использовать & адрес оператора, как это

fwrite(&lista->dati, sizeof(lista->dati), 1, fc); 

Кроме того, вы можете проверить возвращаемое значение fwrite(), чтобы быть уверенным, что это удалось, в этом случае, так как вы пишете один элемент он имеет 1.

Предупреждение: не следует typedef poitners, это может быть проблемой в будущем. И если вам нужно, используйте какую-то нотацию, такую ​​как суффикс _ptr, чтобы указать, что это указатель (libxml-2.0 использует Ptr, например).

+0

теперь отлично работает, но я все еще некоторое замешательство в использовании указателей в этой функции; в моей главной объявляю lista как: t_nodo lista = NULL; и в моей структуре t_nodo является указателем на структуру s_nodo, поэтому lista не является указателем? почему я должен добавить & оператора? – Marco

+0

Вы сбиты с толку, потому что вы его typedef. При объявлении указатель должен иметь '*' рядом с идентификатором, это хорошо. 't_datos' не является указателем, это псевдоним анонимной' struct', который вы используете для хранения данных. 't_datos * dati' сделает указатель' dati'. Но тогда вам понадобится 'malloc()', чтобы выделить место для него. –

Смежные вопросы