作者:有些浮夸 | 来源:互联网 | 2022-11-25 22:42
比方说,我读了std::string
从std::istream
使用std::getline()
过载。如何确定从流中提取了多少个字符?std::istream::gcount()
不能像这里讨论的那样工作:ifstream gcount在getline字符串重载时返回0
#include
#include
#include
int main()
{
std::istringstream s( "hello world\n" );
std::string str;
std::getline( s, str );
std::cout <<"extracted " <
现场例子
请注意,对于下降投票者-字符串的长度不是答案,因为std::getline()
可能会或可能不会从流中提取其他字符。
1> Galik..:
这样做的方法似乎并不完全简单,因为std::getline
可能(也可能不会)读取终止定界符,并且无论哪种情况都不会将其放入字符串中。因此,字符串的长度不足以准确告诉您读取了多少个字符。
您可以测试eof()
以查看是否读取了分隔符:
std::getline(is, line);
auto n = line.size() + !is.eof();
将其包装在一个函数中会很好,但是如何传递回额外的信息呢?
我想的一种方法是,如果读取了分隔符,则将其添加回去,并让调用者对其进行处理:
std::istream& getline(std::istream& is, std::string& line, char delim = '\n')
{
if(std::getline(is, line, delim) && !is.eof())
line.push_back(delim); // add the delimiter if it was in the stream
return is;
}
但是我不确定我会一直想要那个。
@Eljay我知道,我只是不确定原始计数是否可用于任何流函数,包括`gcount()`,除非以*二进制*模式打开文件。在这种情况下,您到处都会得到预期的原始计数。因此,我认为此功能的行为与stardard库函数完全一致。