为什么getline()不接受常量istream?

时间:2014-01-31 23:23:57

标签: c++ const iostream getline istream

这里的基本问题,我正在努力学习iostream的基本知识。

我被告知要构建一个函数读取 const istream& 的行。即validateFile(const istream& is)

我发现我不能将函数getline()与 const istream& 一起用作第一个参数。我想知道为什么。我以为我只是在阅读istream,函数getline()是否会改变它?

是否可以从常量流中获取信息?

3 个答案:

答案 0 :(得分:5)

流的思想是按顺序从中读取一些数据,每次都推进其内部指针。通过前进此指针,您可以更改流对象。你不能从const溪流中读取(除非你const - 施放它们,但这是你不应该做的事情。)

编辑:实际上我们并不关心隐藏在istream接口后面的实际流对象是否使用了一些“内部指针”。确切地说,重要的是流在您读取时会改变其状态,因为下次读取它时会得到不同的结果(您从流中读取下一个内容)。如果你有一个const对象,这意味着你不应该改变它的状态。

此外,还有一个原因是您无法从流中获取数据而不会更改任何内容。在文件流的情况下,您想要从流中读取的下一个内容可能甚至不在内存中,流对象可能必须首先从磁盘读取它,更新其缓冲区等。(编辑:< / strong>但是这不会改变对象的外部可见状态,所以实际上它并不是一个好的参数。请阅读mutable关键字以了解更多信息。)

答案 1 :(得分:2)

可以从const流中获取数据,但您需要通过它管理的streambuf类进行读取:

#include <sstream>
#include <iostream>
#include <cstdio>

int main()
{
    const std::istringstream strm("Const stream");
    std::streambuf* buf = strm.rdbuf();

    char c;
    while ((c = buf->sbumpc()) != EOF)
        std::cout << c;
}

答案 2 :(得分:0)

std::getline()(以及其他I / O函数)设置基础流状态以指示解析或格式化期间的错误。这就是为什么流不能const - 合格。此外,在某些操作之后,流的width()将被重置。