使用 fread 从文件中读取数据到结构体

Grzegorz Szeremeta

我正在编写一段代码,其中一部分是从文件读取“记录”到 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);
    }
4386427

问题是您的记录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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用函数 fread() 读取文件中的数据块

来自分类Dev

如何从数据数组的结构中搜索特定的结构并使用fread进行读取?

来自分类Dev

使用fread找不到文件

来自分类Dev

使用fread读取对齐的列数据

来自分类Dev

在C中使用fread读取文件

来自分类Dev

在C中使用fread读取文件

来自分类Dev

使用 fseek 、 fread 和指针读取文件

来自分类Dev

使用 fread() 在 PHP 中读取 DBF 文件的奇怪行为

来自分类Dev

使用fread和fseek逐行读取

来自分类Dev

扫描文件以查找签名(使用fread)

来自分类Dev

扫描文件以查找签名(使用fread)

来自分类Dev

使用sep =“。从“ data.table”的“ fread”中

来自分类Dev

使用fread()读取后无法对数据帧进行子集

来自分类Dev

为什么不使用fread读取目录文件?

来自分类Dev

C-使用fread逐字节读取文件

来自分类Dev

以相反的顺序使用fread()读取文件会导致内存泄漏?

来自分类Dev

Fread 从文件中读取 double

来自分类Dev

fread 读取文件末尾

来自分类Dev

fread()c中的结构

来自分类Dev

使用R中的fread从文件读取时解释换行\ n字符

来自分类Dev

使用fread和fwrite

来自分类Dev

尝试使用 fread 读取字节但出现分段错误 11

来自分类Dev

使用 fread 将所有文件内容复制到字符数组中

来自分类Dev

使用fread和awk子集许多.dat.gz文件

来自分类Dev

从文件分配内存,然后使用fread和fwrite C

来自分类Dev

使用fread丢失因子顺序导入CSV文件

来自分类Dev

使用“ fread”,如何从csv中消除注释行?

来自分类Dev

使用fread / write函数在C中调整Hashtable的大小

来自分类Dev

fread正在读取文件中的垃圾