4

我正在尝试读取具有以下内容的文件:

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。

4

3 回答 3

3

你说:

我正在使用 windows-7 和 cygwin。

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

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

于 2013-05-13T06:21:10.357 回答
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"
}
于 2013-05-13T06:23:26.650 回答
0

问题肯定是每一行都覆盖了前一行,这又是由于 Windows/DOS 文本文件中的换行符是 CR+LF ( "\r\n") 引起的 - 但是 C 库的 gygwin 版本不接受 CR读行时记帐。CR 本身会将光标位置移回行首。

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

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

(五个中多余的“e”来自比“五”长的“三”)

于 2013-05-13T06:26:35.697 回答