从文件扫描数据时出现分段错误

时间:2013-04-25 02:14:25

标签: c segmentation-fault

所有。

在阅读了细分错误后,我仍然无法弄清楚这个问题的来源。我知道它来自这个特定的功能;我的驱动程序中的其他所有工作。

值得注意的是,所有样式都是枚举数据类型StyleT。

被调用的函数:

openList(&list, "List.txt");

函数的定义:

void openList(VehicleListT *list, char *infilename)
{   
    FILE *infile;
    int i = 0;
    char styleString[20];

    newList(list);

    if((infile = fopen(infilename, "r")) == NULL)
    {
        fprintf(stderr, "ERROR: Cannot open source file!\n");
        exit(1);
    }

    fscanf(infile, "%s\n", list->vehicles[i].vin);
    while(!feof(infile))
    {
        fscanf(infile, "%i\n", list->vehicles[i].year);
        fscanf(infile, "%lf\n", list->vehicles[i].price);
        fscanf(infile, "%s\n", list->vehicles[i].make);

        fscanf(infile, "%s\n", styleString);

        if((strcmp(styleString, "TWO_DOOR")) == 0)
        {
            list->vehicles[i].style = TWO_DOOR;
        }
        if((strcmp(styleString, "FOUR_DOOR")) == 0)
        {
            list->vehicles[i].style = FOUR_DOOR;
        }

        if((strcmp(styleString, "CONVERTIBLE")) == 0)
        {
        list->vehicles[i].style = CONVERTIBLE;
        }

        if((strcmp(styleString, "TRUCK")) == 0)
        {
                list->vehicles[i].style = TRUCK;
        }

        if((strcmp(styleString, "SUV")) == 0)
        {
            list->vehicles[i].style = SUV;
        }

        fscanf(infile, "%s\n", list->vehicles[i].color);
        fscanf(infile, "%s\n", list->vehicles[i].vin);

        i++;
        list->count++;
    }

    fclose(infile);
    return;
}

2 个答案:

答案 0 :(得分:1)

在其他问题中,我找不到,因为我没有完整的代码,一个明显的错误,在你的程序中给你一个分段错误

fscanf(infile, "%i\n", list->vehicles[i].year);
fscanf(infile, "%lf\n", list->vehicles[i].price);

上面的行应该是,

fscanf(infile, "%i\n",  &list->vehicles[i].year);
fscanf(infile, "%lf\n", &list->vehicles[i].price);

答案 1 :(得分:0)

一些想法:

  • 看起来你读了两次VIN(就在while循环之前,然后在它里面)?你能跳过一条线吗?
  • 字符串是否会超限? IE 30 char VIN号码?
  • 或者你跑过数组边界?这个地段的车太多了? :)我建议为此添加安全检查。或者作为链接列表。

我会检查数据是如何加载的,或者在while循环的每次迭代结束时将其打印出来。如果'i'太大,还建议安全检查错误输出。