我正在尝试阅读包含以下内容的文件:
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。
答案 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'来自“三”,长于“五”)