【问题标题】:Reading file into a struct sometimes stops for no reason将文件读入结构有时会无缘无故停止
【发布时间】:2016-04-01 06:58:35
【问题描述】:

我有以下代码:

int main() {    
    FILE *fp = fopen("inventory.txt", "r");
    if (fp == NULL) {
        printf("File Error");
        return 1;
    }

    while (1) {
        char *componentType = malloc(200);
        char *stockCode = malloc(20);
        int numberOfItems = 0;
        int price = 0;
        char *additionalInformation = malloc(20);

        int fileRead = fscanf(fp, "%[^,], %[^,], %i, %i, %[^,\r\n]", componentType, stockCode, &numberOfItems, &price,
                              additionalInformation);

        if (fileRead == EOF) {
            printf("End of file!\n");
            break;
        }

        printf("%s Read Record!\n", stockCode);

        free(componentType);
        free(stockCode); 
        free(additionalInformation);
    }

    printf("DONE!");
    fclose(fp);

}

文件如下所示:

resistor, RES_1R0, 41, 1, 1R0
resistor, RES_10R, 467, 1, 10R
resistor, RES_100R, 334, 1, 100R
resistor, RES_1K0, 500, 1, 1K0
resistor, RES_10K, 169, 1, 10K
resistor, RES_100K, 724, 1, 100K
resistor, RES_1M0, 478, 1, 1M0
diode, BY126, 118, 12
diode, BY127, 45, 12
transistor, AC125, 13, 35, PNP
transistor, AC126, 40, 37, PNP
....

但是,当我运行代码时,它有时会像这样完成:

RES_1R0 Read Record!
RES_10R Read Record!
...
CF12 Read Record!
CF13 Read Record!
Done!

但有时它会无缘无故停止:

RES_1R0 Read Record!
RES_10R Read Record!
...
D12 Read Record!
D13 Read

每次它仍然返回 0。

有什么问题?

【问题讨论】:

  • 您的真实代码是否像所示示例那样泄漏内存?还是只是为了说明目的?以及您的输入文件包含多少行 - 计算出您实际分配了多少内存。对于初学者,请检查所有 malloc 返回值以验证是否有任何分配失败。
  • 尝试在第 20 行附近插入行 free(componentType); free(stockCode); free(additionalInformation);,看看是否可以重现此问题。我用 10000 个条目对其进行了测试,我没有遇到这样的问题。
  • 我使用了您的输入,将其复制到 7600 行,工作正常,我认为这只是您的 shell 的 Edit: visual 问题,您可以删除打印“添加记录”并保持“完成”并检查您是否有出现未显示的情况?
  • 或者tee输出到一个文件,当终端再次产生这个错误时查看文件。即./a.out | tee output.txt
  • 为什么它有时会锁定相同的输入?对我没有意义。我刚刚跑了./a.out; while [ $? == 0 ]; do ./a.out ; done; 10 分钟,没有任何问题。如果你发现另一个“挂起”,打开另一个终端并检查进程是否仍在运行,然后echo $?(在与你运行程序相同的 shell 上)查看它的返回码。我猜它没有运行,你得到 0 因为它可能只是 shell 的视觉效果。

标签: c clion


【解决方案1】:

自从我第一次问这个问题以来,这个问题现在已经发生了很大的变化(即首先我认为这是一个内存/结构问题,然后它变成了一个编译器问题,然后我终于发现这是一个 IDE 问题),因此我决定完全创建一个新问题:Output for CLion IDE sometimes cuts off when executing a program

这个特定问题的答案是,这是 CLion IDE 的问题。要解决此问题,请使用终端编译并运行代码,输出正常。

感谢@Dominik Gebhar 和@Jonathan Leffler 的帮助!!!

【讨论】:

    【解决方案2】:

    fscanf() 在文件末尾返回读取的字符数或为零,而 fgetc(fp) 在到达文件末尾时返回一个字符或 EOF。

    您正在混合使用两种 eof 检测方法。

    【讨论】:

    • “scanf() 在文件末尾返回零”。真的吗? fscanf man page says:“如果到达输入的结尾,则返回值 EOF”。
    • fscanf() 返回成功处理的转换规范的数量,该数量可能为0或更多;或者如果它位于 EOF(文件中没有更多数据),或者存在 I/O 错误,则返回 EOF。它不返回读取的字符数。如果格式字符串有6个转换规范(%s或类似)没有赋值抑制(不包括%*s),则寻找6个返回;任何更少都表明有问题。
    猜你喜欢
    • 2013-08-11
    • 2022-01-25
    • 2019-01-13
    • 2015-03-25
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多