我正在尝试一次读取一行文本文件并将每行打印到终端窗口。我正在使用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$
任何人都可以解释为什么会发生这种情况和/或如何解决问题吗?
答案 0 :(得分:3)
查看数据文件 - 可能使用od -c
。
所有写在彼此行之上的内容听起来好像是在输出中打印\r
(回车)而不是\n
(换行符),可能是因为数据不包含换行符。 也许该文件来自Windows环境, getline()
正在剥离换行符,最后是回车符,输出没有恢复换行符?
或者,该文件可能只包含\r
行结尾 - 在这种情况下,getline()
会将整个文件作为单行读取,并将其作为单行输出。您可以通过向输出添加计数器来演示,为每个输出行递增计数器。您对“方括号打印一次”的观察表明这可能比受到打击的建议更好。输出中有endl
,这很重要。
答案 1 :(得分:0)
您需要删除getline(ifs, line);
,如下所示:
while(getline(ifs,line)) {
cout << "[" << line << "]" << endl;
}
此外,您需要删除方括号之间的空格,否则输出将如下所示:
[ 20100000001 20100000001.xml ]
[ 20100000002 20100000002.xml ]
[ 20100000003 20100000003.xml ]
[ 20100000004 20100000004.xml ]