2014-12-27 2 views
1

Я пытаюсь создать программу на C, которая сохраняет мне такую ​​структуру. Прежде всего, мой английский не самый лучший, но я его очень хорошо понимаю.Сохранение структуры в C с использованием файлов

Основная проблема заключается в том, что я не знаю, где я могу потерпеть неудачу, потому что я новичок, и я уверен, что делаю это с большим количеством ошибок. Я хотел бы прочитать эту .bin позже, так что я не знаю, что делать, я был бы признателен за помощь, спасибо :)

Вот пример моей программы и структур я хочу сохранить:

//HERE THE STRUCT// 
typedef struct{ 
    char name[MAX_Nom_Impresora+1]; 
    int start,end; 
} tExample; 

int main (int argc, char *argv[]){ 

    ... 
    tSave f[4]; 
    Save(f) 
    .... 

}  

//HERE THE FUNCTION TO SAVE THE STRUCT// 

int Save (tExample f[]){ 
    FILE *pf; 
    char *File="list.bin"; 
    int counter=0; 
    int error=0; 

    pf=fopen("File","a"); 
    if(pf==NULL) 
     printf("\n Error."); 
    else{ 
     fwrite(&f, sizeof(f),1, pf); 
    } 
    return error; 
} 
+2

Я думаю, это должно быть 'fopen (Файл," a "). Кроме этого, все выглядит отлично. – Barmar

+0

искать сериализацию – bolov

+2

Не будет 'sizeof (f)' вернуть размер указателя? Лучше добавить количество элементов для вызова этой функции и использовать их и 'sizeof (tExample)' в 'fwrite'. – usr2564301

ответ

1

Вы, кажется, запутать структур, указатели на структуру и массив структур.

Я предполагаю, вы написали tSave f[4], но это должно было быть tExample f[4]. Таким образом, вы пытаетесь сохранить массив из 4-х структур.

Первая проблема заключается в том, что в языке C, когда вы передаете массив как параметр функции, вы фактически передаете адрес первого элемента массива, и нет никакой функции в функции, чтобы получить размер массив. Таким образом, вы должны передать размер массива вместе с самим массивом:

save(f, sizeof(f)/sizeof(tExample)); 

, потому что в модуле, где объявлен массив, компилятор знает размер и вы можете вычислить количество элементов, то, что не представляется возможным в функции save.

Далее, когда вы передали tExample[] для функции save, то, что вы получаете в функции, является адресом. Таким образом, sizeof(f) фактически sizeof(tExample*): размер указателя.Ваш код должен быть:

int Save (tExample f[], int nelts){ 
    FILE *pf; 
    char *File="list.bin"; 
    int counter=0; 
    int error=0; 

    pf=fopen("File","a"); 
    if(pf==NULL) 
     printf("\n Error."); 
    else{ 
     fwrite(f, sizeof(tExample),nelts, pf); 
    } 
    return error; 
} 

Примечание:

  • не & до того f так е на самом деле адрес (массив распался на указатель)
  • использования явно размер STRUC
  • используйте количество элементов, переданных функции
-1

Изменить

SizeOf (е)

в

SizeOf (е) * SizeOf (tExample)

Кроме того, не забудьте закрыть файл до завершения программы.

+0

Умножение размера * указателя * на что-нибудь не полезно ... – usr2564301

+0

@Jongware Вы правы, я сделал тест, и компилятор действительно пожаловался: «warning: sizeof on array function parameter будет возвращать размер 'int * 'вместо' int [] '". –

0

Это версия Posix, что вы могли бы адаптироваться к AnSi, если заменить open, close, read и write с f приставочных версий и работать на FILE * потоках вместо дескрипторов файлов.

static int get_value(const char *path, void *buf,size_t len){ 
    int fd = open(path, O_RDONLY); 
    if (fd<0) return fd; 
    len=read(fd,buf,len); 
    close(fd); 
    return len; 
} 
static int set_value(const char *path, void *buf,size_t len){ 
    int fd = open(path, O_CREAT|O_WRONLY|O_TRUNC,0644); 
    if (fd<0) return fd; 
    len=write(fd,buf,len); 
    close(fd); 
    return len; 
} 

использование:

  • set_value("/path/to/my/struct_file",&my_struct,sizeof(my_struct));
  • get_value("/path/to/my/struct_file",&my_struct,sizeof(my_struct));
Смежные вопросы