C 使用fread将数据从文件读取到结构

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

我正在编写一段代码,其中一部分是将“记录”从文件读取到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);
当我检查这个操作的输出时,发现数组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几个小时。可能是这样,非常感谢你的帮助。再过几个小时我自己也不会发现了。