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

Reading a File and showing on Screen using getline : C++

本文关键字:getline c++ 屏幕 文件 显示 读取      更新时间:2023-10-16

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

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.txtn";
    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

您的状态:

我正在使用windows-7和cygwin。

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

18输出和16输出如您所期望的是由于r加上后面的n

看起来每一行都在屏幕上与前一行相同的位置打印。由于最后一行"17This is Line Five""20 This is Line Three"短一个字符,因此后一行的最后一个'e'保留下来,从而得到"Fivee"

尝试在每次while循环之后打印换行符,如下所示:

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

问题肯定是每行覆盖前一行,这反过来是由于Windows/DOS文本文件中的换行符是CR+LF ("rn")这一事实引起的-但是gygwin版本的C库在读取一行时不考虑CR。CR自己会将光标位置移回行首。

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

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

(5中多余的"e"来自"three",比"five"长)