2012-01-28 66 views
1

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

文本文件看起来像这样:

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$ 

任何人都可以解释为什么这种情况正在发生和/或如何解决这一问题?

+1

注意:您”在每次迭代中重复调用getline两次。你可以通过hexdump运行程序的输出吗? (我猜你的源文本文件中有奇怪的结尾字符。) – Mat 2012-01-28 17:06:11

回答

3

查看数据文件 - 也许用od -c

所有写在其他行上的声音听起来好像是在输出中打印\r(回车)而不是\n(换行符),可能是因为数据不包含换行符。 也许该文件来自Windows环境,并且getline()正在剥离换行符,并在结束时返回回车,并且输出不会恢复换行符?

或者,也许该文件只包含\r行尾 - 在这种情况下,getline()会将整个文件读取为单行,并将其输出为单行。您可以通过向输出添加一个计数器来演示,为每个输出行增加一个计数器。你对'方括号打印一次'的观察表明,这可能比受挫的建议更好。输出中有一个endl,这很重要。

+0

这样做了。 (最后一行都是\ r ...我将它们改为\ n并且它工作正常。)谢谢! – ishmael 2012-01-28 17:16:45

0

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

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

此外,您还需要去掉方括号之间的空间,否则输出看起来就像这样:

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

谢谢。我不是故意要有两个getline。 – ishmael 2012-01-28 17:19:57