gpt4 book ai didi

C 指针、结构和 fwrite

转载 作者:行者123 更新时间:2023-12-02 07:38:42 26 4
gpt4 key购买 nike

我目前正在尝试将一个简单的链表写入文件并将其读取到一个文件中,但它似乎并没有真正起作用,我不确定它是否可行。

typedef struct flug
{
int flugnummer;
char flugziel[50];
enum TAG flugtag;
int flugzeit_stunde;
int flugzeit_minute;
int gateway;
char status[10];
struct flug *next;
}FLUG;

typedef FLUG *ELEM_ZGR;

我担心问题可能在于我不仅在编写字符,而且在编写 int .. 尤其是枚举。​​

int fluege_sichern() {
ELEM_ZGR curr;

FILE *fp;
char* tag;

curr = first;

if (fopen_s(&fp, datei,"a+b") != 0) {
printf("\nDatei %s nicht zum Anhaengen zu oeffnen",datei);
PAUSE;
exit(1);
}

for(curr = first; curr != NULL; curr = curr->next) {
fwrite(curr, sizeof(FLUG), 1, fp);
}

fclose(fp);
return 1;
}

这应该是将元素作为二进制文件写入文件的函数。我在此函数中没有收到任何错误。

void fluege_laden() {
ELEM_ZGR curr;
FILE *fp;
int i = 0;

if (fopen_s(&fp, datei,"rb") != 0) {
printf("\nDatei %s nicht zum Lesen zu oeffnen",datei);
PAUSE;
exit(1);
}

while(1) {
fread(&curr, sizeof(FLUG), 1, fp);
printf("\n%d", curr->flugnummer);
//fluege_sortieren(curr);
}
}

当我尝试打印 curr->flugnummer 时出现错误。

好的,所以我对这两个函数做了一点改动,但它似乎仍然不起作用。抱歉,我好像没听懂...

[EDIT2] 另一个不起作用的版本:

void fluege_laden() {
ELEM_ZGR curr; // <<<- allocate an actual struct here rather than just a pointer
FILE *fp;

int i = 0;
curr = first;

if (fopen_s(&fp, datei,"rb") != 0) {
printf("\nDatei %s nicht zum Lesen zu oeffnen",datei);
PAUSE;
exit(1);
}

while(1) {
fread(curr, sizeof(FLUG), 1, fp);
printf("\n%d", curr->flugnummer); // <<<
printf("\n%s", curr->flugziel);
//fluege_sortieren(curr);
PAUSE;
}

}

int fluege_sichern() {
ELEM_ZGR curr;
FILE *fp;

curr = first;

if (fopen_s(&fp, datei,"a+b") != 0) {
printf("\nDatei %s nicht zum Anhaengen zu oeffnen",datei);
PAUSE;
exit(1);
}

for(curr = first; curr != NULL; curr = curr->next) {
fwrite(curr, sizeof(FLUG), 1, fp);
}

fclose(fp);
return 1;
}

最佳答案

curr 是未初始化的指针(FLUG*),因此在调用 fread() 时未指向有效内存。写入无效内存是未定义的行为(程序可能会出现段错误或错误执行或最坏情况下正确执行)。创建堆栈分配对象(FLUG 类型)或为 curr 动态分配内存。

就我个人而言,我发现当指针是 typedefd 时非常令人困惑,因为在使用时变量是指针并不明显:

ELEM_ZGR curr;

以下是明确的:

FLUG* curr; /* Or just 'FLUG curr;' for this case. */

检查 fread() 的结果确保程序不在陈旧数据上运行:

FLUG curr;
while (1 == fread((&curr, sizeof(FLUG), 1, fp))
{
printf("\n%d", curr.flugnummer);
}

(回应问题编辑)

简而言之,改变:

fwrite(curr, sizeof(FLUG*), 1, fp);
fread(&curr, sizeof(FLUG*), 1, fp);

到:

fwrite(curr, sizeof(FLUG), 1, fp);
fread(curr, sizeof(FLUG), 1, fp);

在这两种情况下,curr 都是一个 FLUG* 并指向用于存储 FLUG 的有效内存,因此您需要阅读 sizeof(FLUG),而不是 sizeof(FLUG*)。任何类型的指针的典型大小都是 4 或 8 个字节。在我的 x86 机器上它是 4 个字节,FLUG 的大小是 88 个字节。 fwrite()fread()size 参数指示要读取和写入的字节数:

fwrite(curr, sizeof(FLUG), 1, fp); /* write 88 bytes to fp from address curr. */
fread(curr, sizeof(FLUG), 1, fp); /* read 88 bytes from fp and write to the
address beginning at curr. */

&curr 的地址传递给 fread() 意味着 FLUG** 被传递给 fread() 这是不正确的。

关于C 指针、结构和 fwrite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13601491/

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