使用getline读取文件并在屏幕上显示:C ++

时间:2013-05-13 06:10:57

标签: 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个字符,包括空格 - 如果我添加空值则变为17 - 终止行字符被getline丢弃。)

我正在使用windows-7和cygwin。

3 个答案:

答案 0 :(得分:3)

你说:

  

我正在使用windows-7和cygwin。

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

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

答案 1 :(得分: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"
}

答案 2 :(得分:0)

问题肯定是每一行都会覆盖前一行,而后者又是由Windows / DOS文本文件中的换行符为CR + LF("\r\n")引起的 - 但是gygwin版本的C库在读取行时不考虑CR。 CR本身会将光标位置移回到行的开头。

我从未使用过很多cygwin,但是当你实际上在Windows上时,它可以很好地假装你是一个Unix风格的系统,这有时会导致这种问题。我不知道是否有一个简单的解决方法 - 通过dos2unix Test.txt运行文件应该做的事情'。

如果我在我的Linux机器上运行它,我会得到一行长文本,而不是每行都会相互覆盖。

(五中的额外'e'来自“三”,长于“五”)