我正在编写一段代码,其中一部分是从文件读取“记录”到 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
不是以零结尾的字符串。
因此打印 using 会%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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句