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

问题描述 投票:1回答:1

我正在使用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/

c++ io stdin
1个回答
0
投票

如果流被格式化了,您不能只检查其长度吗?

Away,对于C ++ 98:

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

对于C ++ 11:

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

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

但是:

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

不过请注意,该peek,putback和unget实际上不会提取任何字符,因此gcount在调用它们中的任何一个后将始终返回零。

因此,也许您可​​以使用istream& getline (istream& is, string& str);来获取gcount()来读取格式化的流。

© www.soinside.com 2019 - 2024. All rights reserved.