2017-05-17 67 views
0

我正在写一段代码,其中一部分正在读取文件中的“记录”到n长度的数组,n作为参数给出。文件中的记录具有恒定的长度(在本例中为1024),并且只包含数字,空格和小写字母。每个记录都以\ n结尾。我用以下结构,以保持一个记录:使用fread从文件读取数据结构

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

和代码用于提取其中的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); 
    } 
+0

请表明写出记录的代码,也是'fopen's该文件的代码。 – dasblinkenlight

+0

@dasblinkenlight我按照你的建议编辑了我的问题。 –

+1

将''r“'改为'”rb“'看看是否有帮助。 – dasblinkenlight

回答

6

的问题是,你的记录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 
+0

这就是可能是这种情况,非常感谢你的帮助。我几个小时后都不会自己找到它。 –