C 使用fread将数据从文件读取到结构
我正在编写一段代码,其中一部分是将“记录”从文件读取到n长度数组,n作为参数给出。文件中的记录具有恒定长度(在本例中为1024),并且仅包含数字、空格和小写字母。每个记录都以\n结尾。我使用以下结构来保存一个记录:C 使用fread将数据从文件读取到结构,c,C,我正在编写一段代码,其中一部分是将“记录”从文件读取到n长度数组,n作为参数给出。文件中的记录具有恒定长度(在本例中为1024),并且仅包含数字、空格和小写字母。每个记录都以\n结尾。我使用以下结构来保存一个记录: typedef struct{ char rec[1024]; } record; 用于提取n个记录并存储在n个长度的记录数组中的代码是这样编写的: record * recs=malloc(n*sizeof(record)); size_t read=fread(recs,siz
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);
当我检查这个操作的输出时,发现数组rec的第一个元素包含所有记录,第二个元素包含所有记录,但第一个除外,依此类推,而不是在数组的每个元素保留一个记录。我有点迷路了,因为我认为它应该将每个记录存储在数组的不同元素中。
正如所建议的,我还提供了打开文件和打印数组元素的代码:
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);
}
if((f=fopen(argv[2],“r”))==NULL){
perror(“打开文件时出错”);
出口(1);
}
对于(int i=0;i而言,问题在于您的记录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;
}
问题是您的记录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;
}
请显示写出记录的代码,以及打开文件的代码。@dasblinkenlight我已根据您的建议编辑了我的问题。请将“r”
更改为“rb”
看看是否有帮助。@dasblinkenlight我已经更改了它,但当我读取示例记录0044000441和00442时,recs数组的第一个元素包含所有这些记录,第二个元素包含00441和00442,第三个元素只包含00443。请显示写出记录的代码,以及fopen
s文件。@dasblinkenlight我已根据您的建议编辑了我的问题。请将“r”
更改为“rb”
看看是否有帮助。@dasblinkenlight我已经更改了它,但当我阅读示例记录0044000441和00442时,recs数组的第一个元素包含所有这些,第二个元素包含00441和00442,第三个元素只包含00443。可能是这样,非常感谢您的帮助。我不会自己再找到它了r几个小时。可能是这样,非常感谢你的帮助。再过几个小时我自己也不会发现了。