【问题标题】:Reading from a file and adding in a linked list从文件中读取并添加到链表中
【发布时间】:2017-04-21 06:43:02
【问题描述】:

我不知道为什么,但这会造成分段错误。我认为问题不在于读取文件和编辑结构的代码。头部是一个虚拟节点。我不知道是什么问题,这让我很沮丧。谁能帮我理解一下?

FOOD *New;
FILE *fp = fopen(strcat(fileName,".txt"), "r");
if(fp==NULL)    {
    printf("File %s is not found.\n", strcat(fileName,".txt"));
    return;
}
while(!feof(fp)){
    New = (FOOD*)malloc(sizeof(FOOD));

    for(i = 0; i < 9; i++){

        if(i == 0||i==1||i==2){
            fgets(scan, 256, fp);
            if(i==0)    strcpy(New->category, scan);
            else if (i==1)  strcpy(New->itemDescription, scan);
            else    strcpy(New->itemUnit, scan);
            //printf("NO");
        }

        else if (i==3||i==4||i==5){
            fscanf(fp, "%f", &fscan);
            fgetc(fp);
            if(i==3)    New->basePrice = fscan;
            else if(i==2)   New->comboPrice = fscan;
            else    New->upgradePrice = fscan;
            //printf("NO");
        }

        else{
            fscanf(fp, "%i", &iscan);
            fgetc(fp);
            if(i==6)    New->hierarchy = iscan;
            else if (i==7)  New->numberOfInitialInventory = iscan;
            else    New->numberOfPresentInventory = iscan;  
            printf("NO");
        }


    }
    if((*head)->next == NULL){
        (*head)->next = New;
        temp = New;
    }
    else{
        temp->next = New;
        temp = New;
    }


}



fclose(fp);

这是食物结构:

typedef struct foodtag{
char category[256];
char itemDescription[256];
char itemUnit[256];
int hierarchy;
int numberOfInitialInventory;
int numberOfPresentInventory;
float basePrice;
float comboPrice;
float upgradePrice;
struct foodtag *prev;
struct foodtag *next;
}FOOD;

【问题讨论】:

  • 你应该发布,至少FOOD struct。最好有MCVE
  • 什么是食物结构?
  • 如果您遇到分段错误,您应该有一个核心文件(取决于 ulimit)来检查。如果没有,您可以在调试器下运行该进程,它将在段错误处停止。
  • 提示:不要将if () 和条件指令放在同一行,这样会很难阅读和调试。
  • 您的调试器会告诉您崩溃发生的确切位置。现在该学习如何使用调试器了。

标签: c file linked-list


【解决方案1】:

(代表 OP 发布)

我已将 while(!feof(fp)) 替换为其他条件,并证明它有效。

【讨论】:

    【解决方案2】:

    您没有为 category 结构的 category 指针分配内存。

    FOOD *my_food = malloc(sizeof(FOOD));
    if (my_food != NULL)
    {
        my_food->category = malloc(256);
        if (my_food->category != NULL)
        {
            // USAGE
        }
    }
    

    编辑我对问题的评论:

    看看why is while feof file always wrong

    【讨论】:

    • 已修复但仍存在段错误
    猜你喜欢
    • 2021-04-08
    • 1970-01-01
    • 2017-10-31
    • 2021-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多