2015-09-16 45 views
0

我創建了一個結構對象的數組&我想將它保存到二進制文件中。然後我再次讀取文件&填充結構,但是我將所有的值都設爲空。寫入一個結構對象的數組以便讀取和讀取它

typedef struct { 
    int a; 
    long b; 
}test; 
int main(void) { 
    test *o1; 
    test *o2; 
    int no_of_obj = 3,i; 

    o1 = malloc(no_of_obj * sizeof(test)); 
    printf("fsdfsdf"); 
    o1[0].a = 11; 
    o1[0].b = 12; 
    o1[1].a = 21; 
    o1[1].b = 22; 
    o1[2].a = 31; 
    o1[2].b = 32; 

    for(i=0;i<no_of_obj;i++) { 
     printf("%d %lu\n",o1[i].a,o1[i].b); 
    } 
    FILE *F = fopen("test.db","wb"); 

    for(i=0;i<no_of_obj;i++) { 
     fwrite(&o1[i],sizeof(test),1,F); 
    } 
    fclose(F); 
    printf("dfsdfds"); 
    F = fopen("test.db","rb"); 
    if(!F) { 
     printf("no file!"); 
     return 0; 
    } 
    fseek(F,0,SEEK_END); 
    int size = ftell(F); 
    int total_objects = size/sizeof(test); 
    o2 = malloc(sizeof(test) * total_objects); 

    for(i=0;i<total_objects;i++) { 
     fread(&o2[i],sizeof(test),1,F); 
    } 
    for(i=0;i<total_objects;i++) { 
     printf("%d %lu\n",o2[i].a,o2[i].b); 
    } 
    return 0; 
} 
+0

您需要在fseek之後重放()。 – Michi

回答

4

當您撥打fseek(F,0,SEEK_END);時,您正在將位置指示器移動到文件末尾。在您呼叫fread()(在您撥打ftell()獲取大小後)之前,您需要移回文件的起始位置,因爲它從指示符的當前位置讀取。

您可以用fseek(F,0,SEEK_SET);rewind(F);來做到這一點 - 它們的效果相同。

如果您檢查了您的fread()的返回值,您會注意到這一點,因爲它返回成功讀取的字節數。 feof()ferror()也很重要。

+0

謝謝!我多麼傻,忘了它。下次永遠記得檢查fread返回的字節數! – user1692342