我正在使用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/
如果流被格式化了,您不能只检查其长度吗?
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()
来读取格式化的流。