这里有一个基础问题,我正在尝试学习iostream的基础知识。
我被告知要构建一个函数来读取const istream&中的行。例如:validateFile(const istream& is)
我发现我不能使用getline()函数作为第一个参数来处理const istream&。我想知道为什么。我认为我只是在读取istream,难道函数getline()会改变它吗?
是否有可能从常量流中获取信息?
这里有一个基础问题,我正在尝试学习iostream的基础知识。
我被告知要构建一个函数来读取const istream&中的行。例如:validateFile(const istream& is)
我发现我不能使用getline()函数作为第一个参数来处理const istream&。我想知道为什么。我认为我只是在读取istream,难道函数getline()会改变它吗?
是否有可能从常量流中获取信息?
const
流中读取(除非您对它们进行const
转换,但这是不应该做的事情)。istream
接口后面的实际流对象是否使用了一些“内部指针”。准确地说,重要的是当您读取它时,流会更改其状态,因为下一次读取它时,您会得到一个不同的结果(从流中读取下一个内容)。如果您获得了一个const
对象,则意味着您不应该更改其状态。mutable
关键字的更多信息。)从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;
}
std::getline()
(以及其他I/O函数)会设置底层流的状态以指示解析或格式化过程中的错误。这就是为什么流不能被const
限定的原因。此外,在某些操作之后,流的width()
会被重置。