C - 如何在文件中存在结构体的情况下保持数组

问题描述:

这是我迄今为止所得到的结果,但实际上并没有在文件中写入。我想我没有使用正确的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

首先,该文件是二进制所以你不应该真的能够将其作为文本阅读。

其次,你的问题的根源,是怎么写的结构:

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可能有错误。也许。 –