使用fread从数据读取数据到结构

时间:2017-05-17 15:00:41

标签: c

我正在编写一段代码,其中一部分正在阅读"记录"从文件到n长度数组,n作为参数给出。文件中的记录具有恒定长度(在本例中为1024)并且仅包含数字,空格和低位字母。每个记录都以\ n结束。我使用以下结构来保留一条记录:

react-router v4

用于提取n个并存储在n长度记录数组中的代码以这样的方式编写:

typedef struct{
char rec[1024];
} record;

当我检查此操作的输出时,结果发现数组recs的第一个元素包含所有记录,第二个除了第一个以外的所有记录,依此类推,而不是在数组的每个元素中保留一个。我有点失落,因为我认为它应该将每条记录存储在数组的不同元素中。 正如所建议的那样,我还提供了打开文件和打印数组元素的代码:

record * recs=malloc(n*sizeof(record));
size_t read=fread(recs,sizeof(record),(size_t)n,f);

1 个答案:

答案 0 :(得分:6)

问题是您的记录rec不是零终止字符串。

因此,使用%s进行打印会显示所有记录,因为打印会一直持续到'\0'为止。

因此要么确保在每个rec中添加零终止,要么使用其他打印方式而不是%s

BTW:如果recs内没有任何零终止,你实际上有未定义的行为。

这个小程序模仿了这个问题:

#include <stdio.h>

struct r {
    char c[1];
};

int main(void) {
    int i;
    struct r recs[4] = {{'a'}, {'b'}, {'c'}, {'\0'}};
                                      //       ^^^^^
                                      //       Just to stop printing here
    for (i=0; i<3; i++)
    {
        printf("%d %s\n", i, recs[i].c);
    }

    return 0;
}

输出:

0 abc
1 bc
2 c