这里的基本问题,我正在努力学习iostream的基本知识。
我被告知要构建一个函数读取 const istream& 的行。即validateFile(const istream& is)
我发现我不能将函数getline()与 const istream& 一起用作第一个参数。我想知道为什么。我以为我只是在阅读istream,函数getline()是否会改变它?
是否可以从常量流中获取信息?
答案 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()
将被重置。