读取文件并显示在屏幕上使用getline: c++
Reading a File and showing on Screen using 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.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"长)
- Seg Fault Issue C++ (file IO / getline)
- 当用户键入分隔符时,停止getline()输入
- getline() 的原型/库是什么;
- 错误 没有与参数列表匹配的重载函数"getline"实例
- 如何在 c++ 中使用 ',' 作为 getline 分隔符
- 错误:调用'getline'没有匹配函数
- 如何在 c++ 中使用 getline 从文件中读取字符串?
- 将 getline() 与文件一起使用
- 我有三个 getline,但是一旦编译,输入就太多了
- 在 std::getline 和 std::cin 期间卡在循环中
- 为什么 getline() 不读取文本文件中的所有内容?
- 有没有办法在不使用 getline() 的情况下从.csv文件中读取?
- 确切地说,如何解释 std::getline(stream, string) 函数在C++中填充的字符串
- std::getline没有在while循环中重新请求用户输入
- 谁能告诉我我用 getline 做错了什么 (cpp) 格式
- Getline(cin,str)的奇怪输出
- 我在C++中使用 getline() 函数时遇到问题
- 而循环跳过 cin.getline() 对于 C 字符串
- 如何在 getline 中删除/忽略超过特定数字的字符?
- 使用 getline(cin, var) 两次在进行字符串比较时会产生错误 (==)