【问题标题】:Manipulating and analysing 4-line data from file处理和分析文件中的 4 行数据
【发布时间】:2012-09-21 03:28:09
【问题描述】:

我需要在一个文本文件中整理出一组4行数据,例如..

[DATA]
[DATA]
[DATA]
[DATA]
[BLANK LINE]
[DATA]
....

我的问题是,如果只有一组 4 行数据,我的下面的函数最终会工作,但是当有一组以上的数据时它会冻结。什么可能导致了这个问题?如果您需要更多代码,请告诉我。

非常感谢。

int i=0;
while(i < (numGames + empLines))
{
    fgets(gameLine, sizeof(gameLine), input2);
    if (gameLine[0] == '\n')
    {
        continue;
    }
    sscanf(gameLine, "%s %d %d %s %d %d", teamName1, &teamGoal1, &teamBehind1, teamName2, &teamGoal2, &teamBehind2);
    int j =0;
    while (j < numTeams)
    {



                                          ...



                 }
                k++;
            }
            break;
        }
        j++;
    }
    i++;
}

【问题讨论】:

  • 没有足够的信息来提供帮助。不要只是添加更多代码,尝试缩小问题范围并打印有问题的部分。添加 printfs() 以查看您要到达的位置是很好的第一步。
  • @John3136 我在整个代码中添加了 printfs() 并且我发现当有一组以上的 4 行数据并因此冻结时代码不想退出 while 循环.
  • 您的示例中没有显示任何内容。哪个while循环有问题:第一个还是第二个? numGames、empLines 和 numTeams 是如何设置的?有一个break 在不知名的地方:这是什么循环?
  • 我们都知道for 循环可以实现为while 循环,您在这里展示的非常精彩。但我可以问为什么吗?
  • 至于你的问题,你确定空行真的是空的吗?没有其他空格或制表符?换行符真的是 '\n' 而不是 "\r\n"(UNIX 与 Windows 行结尾)?

标签: c macos terminal while-loop


【解决方案1】:

根据您的描述,我不知道这是答案,但是根据您的代码:

while(i < (numGames + empLines))
{
    fgets(gameLine, sizeof(gameLine), input2);
    if (gameLine[0] == '\n')
    {
        continue;
    }
    i++;
}

如果文件的最后一行只是一个'\n',那么你将永远循环。我永远不会增加,你也不会检查 feof() 或查看 fgets() 返回值。

【讨论】:

    【解决方案2】:

    很可能,问题在于程序如何解析空行的换行符。 '\n' 不必作为文本文件的第一个字符出现,请更改程序首先读取该行的方式。例如,使用 fgetc() 确定它是数据行还是空白行,直到遇到 '\n' 或 '\r'。如果遇到非终止字符,则为数据行,将指针回退到行首并读取为格式化字符串。

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2018-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多