【问题标题】:C - Reading from a file issue with the last lineC - 从最后一行读取文件问题
【发布时间】:2015-09-18 12:47:55
【问题描述】:

对于我的作业,我的程序的预期输入类似于 ./program "hello" < helloworld.txt。然而,这样做的问题是我必须分析程序中的每一行,所以我将行尾的守卫用作:

while((c = getchar()) != EOF) {
    if (c == '\n') {
    /*stuff will be done*/

但是,我的问题是,如果 helloworld.txt 文件包含:

hello
world

它只会读取第一行(如果有更多行,则读取到倒数第二行)。

为了解决这个问题,我必须严格地创建一个新行,使helloworld.txt 看起来像:

hello
world
//

还有其他方法可以解决这个问题吗?

【问题讨论】:

  • 您的原始文件是否在world 末尾有换行符?有些编辑添加了这些,有些则没有。也许在 EOF 和 \n 上“做点什么”?
  • @DevSolar 我只是假设最坏的情况是标记它的人使用没有新行的测试文件。
  • 但在这种情况下,当您遇到 EOF(并且可能退出)时,您已经阅读了字符 但没有完成“stuff”。这就是你最后一行没有显示的原因。

标签: c newline


【解决方案1】:

修正你的算法。而不是:

while((c = getchar()) != EOF) {
    if (c == '\n') {
        /* stuff will be done */
    } else {
        /* buffer the c character */
    }
}

做:

do {
    c = getchar();
    if (c == '\n' || c == EOF) {
        /* do stuff with the buffered line */
        /* clear the buffered line */
    } else {
        /* add the c character to the buffered line */
    }
} while (c != EOF);

但请注意,如果c 变量的值是EOF,则不应使用它。

【讨论】:

    【解决方案2】:

    你需要重新构建你的程序,以便它可以在EOF 上“做一些事情”,如果它自上一次换行后读取了任何字符。这样,仍然会处理未终止的最终行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多