我正在编写一段代码,其中一部分是从文件读取“记录”到 n 长度数组,n 作为参数给出。文件中的记录具有恒定长度(在本例中为 1024)并且仅包含数字、空格和小写字母。每条记录都以\n 结束。我正在使用以下结构来保存一条记录:
typedef struct{
char rec[1024];
} record;
提取n个并存储在n个长度的记录数组中的代码是这样写的:
record * recs=malloc(n*sizeof(record));
size_t read=fread(recs,sizeof(record),(size_t)n,f);
当我检查此操作的输出时,发现数组 recs 的第一个元素包含所有记录,第二个元素包含除第一个以外的所有记录,依此类推,而不是在数组的每个元素处保留一个。我有点迷茫,因为我认为它应该将每条记录存储在数组的不同元素中。 正如建议的那样,我还提供了用于打开文件和打印数组元素的代码:
if((f=fopen(argv[2],"r"))==NULL){
perror("error opening file\n");
exit(1);
}
for(int i=0;i<(int)read;i++){
printf("record number %d\n %s\n",i,recs[i].rec);
}
最佳答案
问题是您的记录 rec
不是以零结尾的字符串。
因此使用 %s
进行打印会显示所有记录,因为打印将一直持续到它看到 '\0'
。
因此,要么确保在每个 rec
中添加零终止,要么使用不同于 %s
的其他打印方式。
顺便说一句:如果 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
关于c - 使用 fread 从文件读取数据到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44028460/