首页 > getline()这个函数怎么用?

getline()这个函数怎么用?

书上一道题,用未格式化版本的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个字符?


调用 input.getline(s, 5, '\n');, 会得到四种可能的流状态, 抛去最严重的但最不常见的 badbit 不谈. 剩下三种可能:

  1. 文件里不到 5 个字符, 状态置为 eofbit. 程序输出这些字符, 正常结束.

  2. 文件里超过 5 个字符, 但头 5 个字符里却没有指定的分隔符 '\n', 状态置为 failbit, 输出流里已经读入的字符后, 抛出异常. 但因为状态并不是 eofbit, 所以死循环, 不断抛异常, 流里已经无字符读入, 故造成你说的现象.

  3. 文件里超过 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
}

为了说明原因, 我用括号输出了当前流状态. 辅助你理解.


std::string line;
std::getline(file, line, '\n');

http://en.cppreference.com/w/cpp/string/basic_string/getline

【热门文章】
【热门文章】