从格式化输入操作中获取读取字符数

Get amount of read characters from formatted input operation

本文关键字:读取 字符 获取 格式化 输入 操作      更新时间:2023-10-16

我正在使用>>运算符重载从istream读取数字。这工作正常,但现在我需要知道该操作消耗了多少个字符。我目前正在使用类似的东西

int startPos = in.tellg();
double number;
in >> number;
int readChars = in.tellg() - startPos;

这在某些情况下确实有效,但它非常脆弱。当使用std::cin作为in时,这根本不起作用(我认为这是因为std::cin在流中没有位置,它可能是无穷无尽的(。

我的问题(我认为(相当简单:使用>>运算符时如何获取已读取的字符数?

在我的搜索过程中,我遇到了gcount((,但这仅适用于未格式化的输入。
>>运算符的文档似乎也没有对此给出提示:http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

如果流被格式化,你不能只检查它的长度吗?

安利,std::istream::operator>>C++ 98:

该函数被视为执行格式化输入:在内部,该函数通过首先构造哨兵对象(noskipws 设置为 false(来访问输入序列。然后(如果很好(,它从其关联的流缓冲区对象中提取字符,就像调用其成员函数 sbumpc 或 sgetc 一样,最后在返回之前销毁哨兵对象。

对于C++ 11:

该函数被视为执行无格式输入:在内部,该函数通过首先构造哨兵对象(noskipws 设置为 true(来访问输入序列。然后(如果很好(,它从其关联的流缓冲区对象中提取字符,就像调用其成员函数 sbumpc 或 sgetc 一样,最后在返回之前销毁哨兵对象。此函数成功读取和存储的字符数可以通过调用成员 gcount 来访问

因此,您似乎只能计算未格式化输入中的字符数。

但:

修改此函数返回的值(gcount()(的无格式输入操作是:get,getline,ignore,peek,readsome,putback和unget。

但请注意,peek、putback 和 unget 实际上并没有提取任何字符,因此 gcount 在调用其中任何一个字符后将始终返回零。

因此,例如,也许您可以使用istream& getline (istream& is, string& str);std::istream::getgcount()计算格式化的流,