c - 使用 fread 从文件读取数据到结构

标签 c

我正在编写一段代码,其中一部分是从文件读取“记录”到 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 不是以零结尾的字符串。

因此使用 %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

关于c - 使用 fread 从文件读取数据到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44028460/

相关文章:

c - 串口配置help.read()和write()返回-1并且串口通信停止。为什么?

c - 带链表的快速排序

c - 通过 workqueue 调用 aio_complete 时内核 Oops

c - 将 JPEG 图像从 RGB 重写为 HSL : how can i optimize this?

c - libpcap 丢弃来自特定 IP 的一些数据包

c - 关于 sizeof() 和分配的内存

c - 如何计算像: '10+2-4/2' 这样的算术表达式

有符号/无符号值与负值之间的比较

c - strcpy 从一个字符串数组到另一个字符串数组

c - 如何通过pos访问未知结构的元素?