【问题标题】:C - How to persist array if struct in fileC - 如果结构在文件中,如何持久化数组
【发布时间】:2018-03-27 04:43:06
【问题描述】:

这是我到目前为止得到的,但我实际上并没有写在文件上。我认为我没有正确使用 fwrite()

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);
    }

我应该怎么做?

【问题讨论】:

  • 不要在 C 中使用更合适的语言。
  • fwite(data,size_of_one_piece, count_of_pieces, file)你第三个参数用错了
  • @BensaysNotoPoliticsonSO 很遗憾我必须使用 C
  • @JacekCz 不,已经尝试将其更改为硬编码的 1 和 3,我得到了相同的结果

标签: c file fwrite


【解决方案1】:

首先,该文件是二进制,因此您应该无法真正将其作为文本读取。

其次,问题的根源在于您如何编写结构:

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

如果您阅读例如this fwrite reference 你会看到两个大小参数是:

  1. 数据结构的大小
  2. 数据结构的个数

第二个大小参数错误,每次调用fwrite 时,调用都会尝试将总共sizeof(struct t_directory) * sizeof(struct t_directory) 字节写入文件。

正确的应该是写成一个结构:

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

如果您不关心磁盘上的空间(这对于您的表来说将是最小的),那么我建议您一次性写入整个数组。

为此,您当然需要一个 objects 数组而不是指针:

t_directory tabla[100];

然后你就可以一口气写完:

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

【讨论】:

  • 结构可能有对齐问题,有些东西不明显
  • @JacekCz 编译器很可能会添加填充,所以这应该不是问题。除非将文件复制到具有不同对齐要求或课程的另一个平台。
猜你喜欢
  • 1970-01-01
  • 2011-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多