c++ - 如何确定提取了多少个字符`std::getline()`?
问题描述
假设我通过使用重载读取std::string
了std::istream
一个std::getline()
。如何确定从流中提取了多少个字符?std::istream::gcount()
不像这里讨论的那样工作:ifstream gcount 在 getline 字符串重载时返回 0
#include <iostream>
#include <sstream>
#include <string>
int main()
{
std::istringstream s( "hello world\n" );
std::string str;
std::getline( s, str );
std::cout << "extracted " << s.gcount() << " characters" << std::endl;
}
请注意,对于downvoters - 字符串的长度不是答案,因为std::getline()
可能会或可能不会从流中提取额外的字符。
解决方案
执行此操作的方法似乎并不完全简单,因为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;
}
但我不确定我会一直想要那个。
推荐阅读
- javascript - 如何在 React 中同步测试?
- python - AWS Lambda - 将 S3 中的多个 CSV 文件合并到一个文件中
- asp.net-mvc - 处理请求时发生未处理的异常。当我想按类别列出产品时出现此错误?
- javascript - 将新元素添加到对象数组并在 HTML 中显示
- algorithm - 在python中有效地查找最近的坐标(Long,Lat)
- r - 使用正则表达式将字符串中的数字替换为四舍五入的数字
- reactjs - “在‘redux’中找不到导出‘createStore’
- terraform - 将多个不同大小的 EBS 卷附加到 EC2 实例
- java - 创建一个扩展 java.io.PrintStream 类的类
- android - 我在哪个活动中?