为什么我的循环没有到达文件的末尾?

时间:2014-10-27 18:48:17

标签: c loops visual-studio-2012 file-io struct

我正在Windows 8.1上的Visual Studio 2012中构建一个应用程序,该应用程序使用线性回归来计算/预测特定年份的世界人口。正在从文本文件中读取数据,程序使用数据计算线性回归。

文本文件内容:

0.001 0.200
1.000 0.310
1.500 0.450
1.650 0.500
1.750 0.791
1.800 0.978
1.850 1.262
1.900 1.650
1.927 2.000
1.950 2.519
1.955 2.756
1.960 2.982
1.965 3.335
1.970 3.692
1.975 4.068
1.980 4.435
1.985 4.831
1.990 5.263
1.995 5.674
2.000 6.070
2.005 6.454
2.008 6.707
2.009 6.800

我遇到的问题是,当我遍历文件以将数据存储在结构数组中时,在完全读取文件之前,我得到一个异常。

这是我遇到问题的功能:

int ReadFile(char* filename) {
    char line[20];
    int i = 0;
    int recordCount = 0;
    FILE* file = NULL;
    Population* wp[] = {0};

    file = fopen(filename, "r"); /* open text file for reading */
    if (file != NULL) {
        printf("FILE OPENED FOR READING\n");
        while (fgets(line, 20, file) != NULL) {
            fscanf(file, "%s", line);
            recordCount++;
        }
        fclose(file);
        printf("There are %d records.\n\n", recordCount);
        //*wp = (Population*)malloc(sizeof(Population) * recordCount);
        file = fopen(filename, "r");
        for (i = 0; i < recordCount; i++) {
            wp[i] = (Population*)malloc(sizeof(Population));
            fscanf(file, "%5f", &wp[i]->year);
            printf("%f ", wp[i]->year);
            fscanf(file, "%5f", &wp[i]->population);
            printf("%f\n", wp[i]->population);
        }
    }
    fclose(file);
    return 1;
}

最后一个for循环(我用于结构的malloc空间的那个)是崩溃我的程序的那个。在第4次崩溃之前,我可以进行大约3次迭代。

抛出异常:

First-chance exception at 0x7741D7E0 (ntdll.dll) in worldpopulation.exe: 0xC0000005: Access violation reading location 0x871EADD7.
Unhandled exception at 0x7741D7E0 (ntdll.dll) in worldpopulation.exe: 0xC0000005: Access violation reading location 0x871EADD7.

异常似乎是由文件指针损坏引起的,但我不明白为什么。任何人都可以帮我找出最后一个循环导致崩溃的原因吗?谢谢!

1 个答案:

答案 0 :(得分:3)

while (fgets(line, 20, file) != NULL) {
    fscanf(file, "%s", line);
    recordCount++;

你正在阅读两次并计算一次。首先使用fgets,然后使用fscanf。我猜你想要摆脱fscanf

另一个问题是:

Population* wp[] = {0};
[...]
wp[i] = (Population*)malloc(sizeof(Population));

访问wp[0]以外的任何内容均属违法行为。再一次,我猜你要分配类似的东西:

Population** wp = malloc(recordCount * sizeof *wp);

您两次阅读文件的方式效率不高。您应该第一次执行fscanf,并根据需要wp增长realloc