【问题标题】:C++ Issue Reading Text FileC++ 问题读取文本文件
【发布时间】:2013-01-12 21:03:38
【问题描述】:

我正在尝试使用 C++,但在读取文本文件时出现以下错误。知道为什么吗?

输入:

This is a test.
    A test, with tabs  and too many spaces.
If this is a good one,
    then all will be well.

输出:

    then all will be well. too many spaces.

代码:

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {    

    string line;

    ifstream infile ("A5.txt");

    if (infile.is_open()) {
        while (!infile.eof()) {
            getline(infile,line);
            cout << line << endl;
        }
        infile.close();
    }
return 0;
}

【问题讨论】:

  • 丢失while(!infile.eof()) 构造。它也被称为“帕斯卡病”。在 C/C++ 中,在您读取 过去 文件末尾之前,eof() 是 not true,因此您将调用 getline() one too many i> 次。 while( getline( infile, line ) ) 是编写此类循环的惯用正确方法。
  • 我第二个@arayq2 的评论,进一步说鉴于 this 程序的构造,你也可以失去if (infile.is_open()) 并简单地直接从ifstream infile ("A5.txt"); 移动到while( getline( infile, line ) ) 循环。

标签: c++ text


【解决方案1】:

您使用的实现使用 UNIX 行结尾 (\n),并解释 \r 以将光标返回到行首。该文件包含旧的 Mac OS 行结尾 (\r),这意味着 getline() 一直读取到文件末尾并将所有 \r 放入字符串中,导致您稍后将它们打印到控制台。

【讨论】:

  • 您是如何发现 OP 在 MacOS-9 上创建了一个文本文件的? :) \r 假设有点不稳定恕我直言
  • @akira:这是我能想到的唯一可能的解释,假设系统运行正常。 OP 可以使用十六进制查看器或计算循环执行的次数来验证它。 ⋮)
  • \r 本身是一个有效的理论,但不是“旧的 macos”.. 我宁愿认为 netbeans 会摆弄输出。打印出\r 确实会产生所描述的行为;恕我直言,它的输出或输出的解释,而不是这里的问题输入。
  • 很奇怪。那么我该如何解决这个问题呢?
  • 出色的分析。回车(和缺少换行符)导致每一行覆盖前一行。
猜你喜欢
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 2019-07-01
相关资源
最近更新 更多