2017-10-15 98 views
0

這是我迄今爲止所得到的結果,但實際上並沒有在文件中寫入。我想我沒有使用正確的fwrite()C - 如何在文件中存在結構體的情況下保持數組

typedef struct t_directory { 
    int index; 
    char nombre[255]; 
    int padre; 
}t_directory; 

int main(void) { 

    t_directory* tabla[100]; 

    int i; 
    for(i=0; i<100;i++){ 
     tabla[i] = malloc(sizeof(struct t_directory)); 
     tabla[i]->index = 0; 
     sprintf(tabla[i]->nombre, ""); 
     tabla[i]->padre = 0; 
    } 

    tabla[0]->index = 0; 
    sprintf(tabla[0]->nombre, "root"); 
    tabla[0]->padre= -1; 

    tabla[1]->index = 1; 
    sprintf(tabla[1]->nombre, "user"); 
    tabla[1]->padre= 0; 

    FILE * file= fopen("directorios.txt", "wb"); 
    if (file != NULL) { 
     fwrite(tabla[0], sizeof(struct t_directory), sizeof(struct t_directory), file); 
     for(i=1;i<100;i++){ 
      if(tabla[i]->index != 0){ 
       fwrite(tabla[i], sizeof(struct t_directory), sizeof(struct t_directory), file); 
      } 
     } 
     fclose(file); 
    } 

我應該怎麼做呢?

+0

不要在C中使用更合適的語言。 – Ben

+0

'fwite(data,size_of_one_piece,count_of_pieces,file)'你使用第三個參數錯誤 –

+0

@BensaysNotoPoliticsonSO很遺憾我必須使用C – Marco

回答

3

首先,該文件是二進制所以你不應該真的能夠將其作爲文本閱讀。

其次,你的問題的根源,是怎麼寫的結構:

fwrite(tabla[0], sizeof(struct t_directory), sizeof(struct t_directory), file); 

如果你讀如this fwrite reference你會看到兩個大小論點是:

  1. 數據結構
  2. 數量的數據結構的

你得到第二尺寸參數錯誤的大小,和呼叫嘗試總共寫入sizeof(struct t_directory) * sizeof(struct t_directory)字節到文件,每次您撥打fwrite

正確的應該是寫一個結構:

fwrite(tabla[0], sizeof(struct t_directory), 1, file); 
//           ^
// Note the value one here, to write only a single structure 

如果你不關心磁盤上的空間(這將是最小的爲你的表),那麼我建議你寫整個陣列在一個去。

對於這個工作,你當然需要有對象代替指針數組:

t_directory tabla[100]; 

然後,你可以把它寫在同一個電話:

fwrite(tabla, sizeof tabla[0], sizeof tabla/sizeof tabla[0], file); 
+0

結構可能有對齊問題,有些東西不明顯 –

+0

@JacekCz編譯器很可能會添加填充,所以它不應該是一個問題。除非文件被複制到具有不同對齊要求或課程的另一個平臺。 –

+0

在一次操作中讀取N,並且Nx1可能有錯誤。也許。 –

相關問題