2014-12-27 67 views
1

我想在C中製作一個程序,這節省了我這種結構。首先,我的英語不是最好的,但我很瞭解它。使用文件在C中保存一個結構

主要問題是,我不知道我可以失敗的地方,因爲我是新的,我確信我正在做這個有很多錯誤。我想稍後閱讀的.bin,所以我不知道該怎麼做,我將不勝感激一些幫助,謝謝:)

在這裏我要救我的PROGRAMM和結構的一個例子:

//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 2014-12-27 14:35:36

+0

查找序列化 – bolov 2014-12-27 14:35:41

+2

'sizeof(f)'不會返回指針的大小嗎?最好在該函數調用中添加元素的數量,並在'fwrite'中使用該元素和'sizeof(tExample)'。 – usr2564301 2014-12-27 14:37:42

回答

1

你似乎混淆結構,指向struct和結構的數組。

我假設,你寫了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由於f實際上是一個地址前(數組衰減到指針)
  • 使用顯式地在STRUC的大小
  • 明確使用您傳遞給函數的元素的數量
-1

變化

的sizeof(F)

的sizeof(F)*的sizeof(tExample)

此外,請記住程序結束之前,關閉該文件。

+0

將*指針*的大小乘以任何東西都是沒有用的...... – usr2564301 2014-12-27 16:47:22

+0

@Jongware你說得對,我做了一個測試,編譯器實際上抱怨道:「警告:sizeof數組函數參數將返回大小'int *'而不是'int []'「。 – 2015-01-04 05:36:31

0

這是一個POSIX版本,您能適應如果更換openclosereadwritef前綴版本和FILE *流,而不是文件描述符操作爲ANSI。

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));
相關問題