与文件和链表一起工作时崩溃

3
我正在编写一个程序,该程序从文件中获取信息并将其添加到链表中,以及一个函数,用于向链表中添加信息。 我的问题是,在调用openBook()之后调用addContact()会导致程序崩溃,但分别调用它们则可以正常工作。
我找不到问题所在。 openBook():打开文件,将数据从文件读入链表中
addContact():接收信息,将数据保存到链表中
#include <stdio.h>

typedef struct node {
    char name[50];
    char email[50];
    char ad[200];
    char phone[11];
    struct node *next;
} NODE;

NODE *head = NULL;

void openBook()
{
    FILE *read = fopen("Book.txt", "r");

    if (read == NULL)
    {
        return;
    }
    NODE *ite = NULL;
    char name[50] = "", email[50] = "", ad[200] = "", phone[11] = "";

    if (!feof(read))
    {
        head = (NODE*)malloc(sizeof(NODE));
        fscanf(read, "%s%s%s%s", head->name, head->email, head->ad, head->phone);
    }
    ite = head;
    while (!feof(read))
    {
        ite->next = (NODE*)malloc(sizeof(NODE));
        ite = ite->next;
        fscanf(read, "%s%s%s%s", ite->name, ite->email, ite->ad, ite->phone);
    }
    ite->next = NULL;
    fclose(read);
}

void addContact()
{
    NODE *ite = head;
    if (head != NULL)
    {
        while (ite->next!=NULL)
            ite = ite->next;
        ite->next = (NODE*)malloc(sizeof(NODE*));
        ite = ite->next;
    }
    else
    {
        head = (NODE*)malloc(sizeof(NODE*));
        ite = head;
    }
    fflush(stdin);
    printf("Enter name (no space): ");
    scanf("%s", ite->name);
    fflush(stdin);
    printf("Enter email : ");
    scanf("%s", ite->email);
    fflush(stdin);
    printf("Enter address : ");
    scanf("%s", ite->ad);
    fflush(stdin);
    printf("Enter phone : ");
    scanf("%s", ite->phone);
    fflush(stdin);
    ite->next = NULL;
}

void printList()
{
    NODE *iterator;
    int i;
    iterator = head;
    while (iterator != NULL)
    {
        printf("%s\n", iterator->name);
        iterator = iterator->next;
    }
}

int main()
{
    openBook();
    addContact();
    printList();
    return 0;
}

以下内容令人惊叹:

int main()
{
    addContact();
    printList();
    return 0;
}

但是以下内容会导致崩溃:
int main()
{
    FILE *read = fopen("Book.txt", "r");
    fclose(read);
    addContact();
    printList();
    return 0;
}

2
不要强制转换 malloc() - iBug
2
不要使用fflush(stdin) - iBug
2
为什么 while(!feof()) 是一个不好的想法 - iBug
3
你的代码中找不到 stdlib.h 库。如果你在代码中使用了 malloc() 但没有包含这个库,编译器会给出一个警告。请检查并添加相应的头文件。 - iBug
1
您可能想要向我们提供您的输入和“Book.txt”的内容。我真的无法复现您的问题。 - iBug
显示剩余17条评论
2个回答

2
首先,有三点值得注意: 另外,你好像缺少了#include <stdlib.h>。对于缺少malloc()声明,编译器应该会发出警告。
在修复了缺少的头文件后,我无法重现你的问题。我创建了一个Book.txt文件,程序完美地运行了起来。
这是我用于测试的Books.txt文件。
aaa aaa aaa aaa
aaa aaa aaa aaa
aaa aaa aaa aaa
aaa aaa aaa aaa
aaa aaa aaa aaa

用于测试的输入:

aaa aaa aaa aaa

@mohammadmozafari 是的。 - iBug
我应该使用什么代替!feof()? - mohammad mozafari
1
@mohammadmozafari 使用fscanf()的返回值。它报告成功读取了多少个项目。 - iBug
2
值得详细阐述的是:如果没有正确声明 malloc() 并且没有使用适当的编译器选项,那么编译器将假定它具有旧的、过时的默认设置,即不带参数并返回一个 int,因此在任何其他情况下调用它时都会发生极其错误的事情,并且崩溃也不足为奇。 - underscore_d

1
除了以上给出的答案,还有一个值得注意的变化是ite->next = (NODE*)malloc(sizeof(NODE*));应该改为ite->next = malloc(sizeof(NODE));。你刚刚为指针NODE*分配了内存,但你需要为NODE的大小分配内存。

我认为这就是了(虽然使用带有强制转换和没有正确包含的malloc()也是另一个不错的选择) - Ingo Leonhardt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接