我正在尝试一次读取一个文本文件并将每一行打印到终端窗口。我正在使用 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$
谁能解释为什么会发生这种情况和/或如何解决这个问题?
最佳答案
查看数据文件 - 可能使用 od -c
。
写在每一行之上的所有内容听起来好像你在输出中打印 \r
(回车)而不是 \n
(换行),也许因为数据不包含换行符。 也许文件来自 Windows 环境,并且 getline()
正在剥离换行符,在末尾留下回车符,并且输出没有恢复换行符?
或者,也许文件只包含 \r
行结尾 - 在这种情况下,getline()
会将整个文件作为一行读取,并将其输出作为单行。您可以通过向输出添加一个计数器来证明这一点,并为每个输出行递增它。您对“打印一次方括号”的观察表明,这可能比令人震惊的建议更好。输出中有一个 endl
,这很重要。
关于c++ - getline 并用 cout 打印,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9047071/