2013-05-13 94 views
4

我试图读取文件以下内容:读取文件,并使用函数getline显示在屏幕上:C++

This is Line One 
This is Line Two 
This is Line Three 
This is Line Four 
This is Line Five 

代码:

#include <iostream> 
#include <fstream> 
#include <limits> 

using namespace std; 

int main() 
{ 

    char buff[50]; 

    ifstream is("Test.txt"); 
    if(!is) 
    cout << "Unable to open Test.txt\n"; 

    while(is.getline(buff,50,'\n')) 
    { 
     cout << is.gcount(); 
     cout << buff; 
     cout << "\n----------------\n"; 
     } 
    return 0; 
    } 

输出:

$ ./Trial 
18This is Line One 
---------------- 
18This is Line Two 
---------------- 
20This is Line Three 
---------------- 
19This is Line Four 
---------------- 
17This is Line Five 
---------------- 

现在假设如果我评论cout << "\n----------------\n";

while(is.getline(buff,50,'\n')) 
    { 
     cout << is.gcount(); 
     cout << buff; 
     //cout << "\n----------------\n"; 
     } 

我得到的输出:

$ ./Trial 
17This is Line Fivee 

我无法弄清楚 - 为什么这样的行为?

另外为什么显示计数为18(假设第一行 - 其中第一行包含16个字符,包括空格 - 如果我添加null,则它变为17 - 行尾字符被getline丢弃)。

我正在使用windows-7和cygwin。

+0

在我看来,该行获取与每次循环覆盖。如果你不是'cout <<“\ n ---------------- \ n”;'写'cout << endl;'?你也不应该''使用命名空间标准;' – olevegard 2013-05-13 06:18:47

+0

我猜这个问题是在cygwin环境中。你可以尝试将输出重定向到文件'$。/ Trial> out.txt'吗? – nullpotent 2013-05-13 06:22:32

回答

3

幽州:

我使用Windows-7和Cygwin。

问题很可能是您的cygwin环境正在以二进制模式读取文件,但该文件是以DOS文本格式保存的。这意味着每行发射后,尾随\r字符将导致下一个发射线覆盖前一个。

如您预期的那样,18输出与16是因为\r加上尾随的\n

+0

哦,是的,这一定是它。 – nullpotent 2013-05-13 06:23:07

1

看起来每行都与前一行一样被打印在屏幕的相同位置。由于最后一行"17This is Line Five"是比"20 This is Line Three"短一个字符,因此最后一行'e'仍然存在,给你"Fivee"

尝试而每次迭代后打印换行,像这样:

while(is.getline(buff,50,'\n')) 
{ 
    cout << is.gcount(); 
    cout << buff; 
    cout << endl; // <- std::endl means "\n" 
} 
0

的问题肯定是各行会覆盖前行,而这又是由以下事实导致在一个换行符Windows/DOS文本文件是CR + LF("\r\n") - 但读取一行时,C库的gygwin版本不考虑CR。 CR本身会将光标位置移回行的开头。

我从来没有用过很多cygwin,但是当你真的在Windows上时,它会假装你是Unix系统的系统,这有时会导致这种问题。我不知道是否有一个简单的修复 - 通过dos2unix Test.txt运行文件应该做的伎俩'。

如果我在我的Linux机器上运行这个,我会得到一长串文本,而不是每一行都覆盖对方。

(五额外的“E”是从“三”,这是比“十一五”长)

相关问题