【问题标题】:getline and printing with coutgetline 和使用 cout 打印
【发布时间】:2012-01-28 17:00:57
【问题描述】:

我正在尝试一次读取一行文本文件并将每一行打印到终端窗口。我正在使用 g++ 在 Mac 上编译,例如 g++ cpp3.cpp -o cpp3。

文本文件如下所示:

20100000001 20100000001.xml
20100000002 20100000002.xml
20100000003 20100000003.xml
20100000004 20100000004.xml

这是我的代码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    ifstream ifs("file.txt");
    string line;
    while(getline(ifs,line)) {
        getline(ifs,line);
        cout << "[ " << line << " ]" << endl;
    }
return 0;
}

我希望输出看起来像:

[20100000001    20100000001.xml]
[20100000002    20100000002.xml]
[20100000003    20100000003.xml]
[20100000004    20100000004.xml]

但是,所有内容都打印到终端中的一行。换句话说,文本文件中的每一行都写在最后一行之上。此外,括号“[”和“]”似乎只写了一次,因此它基本上打印“[”,然后是文件的全部内容,然后是“]”。

所以这就是终端的最终输出:

user$ ./cpp3
 ]10000000401   20100000004.xml

user$

谁能解释为什么会发生这种情况和/或如何解决这个问题?

【问题讨论】:

  • 注意:您在每次迭代中调用 getline 两次。你能通过 hexdump 运行程序的输出吗? (我猜你的源文本文件中有奇怪的行尾字符。)

标签: c++ text


【解决方案1】:

查看数据文件 - 可能是 od -c

写在另一行顶部的所有内容听起来好像您在输出中打印\r(回车)而不是\n(换行符),可能是因为数据不包含换行符。 也许文件来自 Windows 环境,getline() 正在剥离换行符,在末尾留下回车,并且输出没有恢复换行符?

或者,文件可能只包含\r 行尾——在这种情况下,getline() 会将整个文件作为单行读取,并将其作为单行输出。您可以通过在输出中添加一个计数器来证明这一点,并为每个输出行递增它。您对“打印一次方括号”的观察表明这可能比受打击的建议更好。您在输出中有一个 endl,这很重要。

【讨论】:

  • 成功了。 (结束行都是 \r...我将它们更改为 \n 并且效果很好。)谢谢!
【解决方案2】:

您需要像这样删除getline(ifs, line);

while(getline(ifs,line)) {
    cout << "[" << line << "]" << endl;
}

另外,您需要删除方括号之间的空格,否则输出将如下所示:

[ 20100000001    20100000001.xml ]
[ 20100000002    20100000002.xml ]
[ 20100000003    20100000003.xml ]
[ 20100000004    20100000004.xml ]

【讨论】:

  • 谢谢。我不是故意要两个 getline 的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 2019-03-03
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多