cari

Rumah  >  Soal Jawab  >  teks badan

c++ - 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个字符?

大家讲道理大家讲道理2806 hari yang lalu568

membalas semua(2)saya akan balas

  • PHPz

    PHPz2017-04-17 13:16:23

    调用 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
    }

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

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-17 13:16:23

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

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

    balas
    0
  • Batalbalas