我目前正在尝试将一个简单的链表写入文件中,但实际上并没有奏效,我不确定是否可行。

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()时未指向有效内存。写入无效的内存是 undefined 的行为(程序可能会分割错误或执行不正确,或者最坏情况下可以正确执行)。创建一个堆栈分配的对象(类型FLUG)或动态分配内存给curr

就个人而言,当指针是typedef d时,我会感到非常困惑,因为在使用时并不明显变量是指针:

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个字节。 sizefwrite()fread()参数指示读取和写入的字节数:
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 - C指针,结构和fwrite,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13601491/

10-11 22:05