gpt4 book ai didi

c - C 中 fwrite 和 struct 的奇怪错误

转载 作者:行者123 更新时间:2023-11-30 19:42:18 24 4
gpt4 key购买 nike

大家好,我是 c 新手,这是我在 StackOverFlows.com 上的第一个答案,请做好:),

我真的不明白这种行为。

这是我的代码:

#include <stdio.h>

typedef struct record{
char nome[20];
enter code herechar cognome[30];
} rec ;

void main(){
rec p={"mario","rossi"};
FILE* f;
f=fopen("x.dat","w");
fwrite(&p,sizeof(rec),2,f);// i write 2 times mario rossi
fclose(f);
f=fopen("x.dat","r");
rec d[2];
fread(d,sizeof(rec),1,f);// pt1
fread(d,sizeof(rec),1,f);
printf("%s %s\n",d[0].nome,d[0].cognome);
printf("%s %s\n",d[1].nome,d[1].cognome);
fclose(f);


f=fopen("x.dat","r");
d[2];
fread(d,sizeof(rec),1,f);// pt2
fread(d+sizeof(rec),sizeof(rec),1,f); //pt3
printf("%s %s\n",d[0].nome,d[0].cognome);
printf("%s %s\n",d[1].nome,d[1].cognome);
fclose(f);

}

我想从文件中写入和读取 2 个结构体,并将它们重定向到一个数组中所以问题是:

  1. 为什么 pt1 行中的 2 fread 无法将结构存储到数组中?

  2. 对我来说这是一个谜:为什么 pt2 行有相同的指令不要失败??和 pt3 线失败???

  3. 在 pt3 行中,我发明了 d+sizeof(rec) 因为我认为指针算术我不知道它是否合法,但输出与 pt1 行相同这段代码有错误吗???

非常感谢您的帮助:)

最佳答案

您的所有读取实际上都有效,但您没有读取您认为正在读取的内容,也没有将您读取的内容存储在您认为存储的位置。

传递给fwrite的数字并不表示写入数据多少次,而是表示指针指向多少条记录。
(也就是说,指针被认为指向数组中的第一个元素以及数组包含多少个元素的数字。)

或多或少地逐行检查代码,跳过最不有趣的部分:

fwrite(&p,sizeof(rec),2,f);

这将写入“mario rossi 记录”以及紧随其后存储的任何 sizeof(rec) 字节。
该数据可能看起来像随机垃圾。

rec d[2];

该数组的元素未初始化,可能包含任何内容。
在此阶段,读取其元素尚未定义。

fread(d,sizeof(rec),1,f);// pt1 

这会将“mario rossi record”读取到 d 的第一个元素中。

fread(d,sizeof(rec),1,f);

这会将“随机垃圾记录”读取到 d 的第一个元素中,替换“mario rossi 记录”。

第二个元素仍然包含未初始化数据。

printf("%s %s\n",d[0].nome,d[0].cognome);

这会打印您之前编写的“随机垃圾记录”。

printf("%s %s\n",d[1].nome,d[1].cognome);

这将打印您从未替换的未初始化数据。

d[2];

这条线没有完成任何事情。

fread(d,sizeof(rec),1,f);// pt2

这会将“mario rossi record”读取到 d 的第一个元素中。

fread(d+sizeof(rec),sizeof(rec),1,f); //pt3

这会将“随机垃圾记录”读取到 d 的第二个元素中。

printf("%s %s\n",d[0].nome,d[0].cognome);

这是您输出任何有效数据的唯一一次,这就是它看起来有效的原因。

如果你想把“mario rossi record”写两遍,就写两遍:

fwrite(&p,sizeof(rec),1,f);
fwrite(&p,sizeof(rec),1,f);

关于c - C 中 fwrite 和 struct 的奇怪错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32415125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com