Rumah > Soal Jawab > teks badan
书上一道题,用未格式化版本的getline逐行读取一个文件,再将读到的内容打出来,我是这样编写的:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream input("C:/Users/0e/Desktop/1.txt");
char s[5];
while (!input.eof())
{
input.getline(s, 5, '\n');
cout<<s;
}
}
先不说别的问题,就说我的本意是用字符数组连续读写内容,为什么这个程序只能打出5个字符?
PHPz2017-04-17 13:16:23
调用 input.getline(s, 5, '\n');
, 会得到四种可能的流状态, 抛去最严重的但最不常见的 badbit
不谈. 剩下三种可能:
文件里不到 5 个字符, 状态置为 eofbit. 程序输出这些字符, 正常结束.
文件里超过 5 个字符, 但头 5 个字符里却没有指定的分隔符 '\n', 状态置为 failbit, 输出流里已经读入的字符后, 抛出异常. 但因为状态并不是 eofbit, 所以死循环, 不断抛异常, 流里已经无字符读入, 故造成你说的现象.
文件里超过 5 个字符, 且头 5 个字符里包含指定的分隔符 '\n', 状态置为 goodbit, 输出流里的字符, 继续下一个循环, 直到遇到 1 or 2 的情况.
这就是原因.
再说说这种情况下 getline 应该怎么用.
因为我不知道你的 1.txt 是啥内容, 改为 stringstream
是一样的, 修改你的程序如下:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
istringstream input("das\ndsa\nddas\ndass\nad\nsadasd");
char s[5];
while (input.getline(s, 5, '\n'))
{
cout << s << endl;
cout << "(" << input.rdstate() << ")" << endl; // debug: goodbit
}
cout << "(" << input.rdstate() << ")" << endl; // debug: failbit
}
为了说明原因, 我用括号输出了当前流状态. 辅助你理解.
天蓬老师2017-04-17 13:16:23
std::string line;
std::getline(file, line, '\n');
http://en.cppreference.com/w/cpp/string/basic_string/getline