为什么istreambuf_iterator推进不起作用
Why doesn't the istreambuf_iterator advance work
我正在阅读用istream_iterators构建一个向量,这是关于将一个完整的文件内容读取到一个字符向量中。而我希望将文件的一部分加载到字符向量中。
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char *argv[])
{
ifstream ifs(argv[1], ios::binary);
istreambuf_iterator<char> beginItr(ifs);
istreambuf_iterator<char> endItr(beginItr);
advance(endItr, 4);
vector<char> data(beginItr, endItr);
for_each(data.cbegin(), data.cend(), [](char ch)
{
cout << ch << endl;
});
}
这不起作用,因为提前是不起作用的,而前面提到的问题的公认答案是有效的。为什么istreambuf_iterator
的前期工作不到位?
还有
endItr++;
endItr++;
endItr++;
endItr++;
cout << distance(beginItr, endItr) << endl;
返回0。请有人解释一下发生了什么事!
为什么在istreambuf_titerator上不进行高级工作?
它有效。它推进迭代器。问题是istreambuf_iterator
是输入迭代器,而不是前向迭代器,这意味着它是一个单程迭代器:一旦你推进它,你就再也无法访问以前的状态。要做你想做的事情,你可以简单地使用一个老式的for循环,它的计数为4。
istreambuf_iterator
从basic_streambuf
读取连续字节。它不支持定位(basic_istream::seekg
和basic_istream::tellg
)。
这是因为它是一个单程输入迭代器,而不是前向迭代器或随机访问迭代器;它被设计为能够处理不支持定位的流(例如管道或TCP套接字)。
您可能会发现file/ifstream上的双向迭代器中的一些解决方案非常有用。
如果其他人偶然发现了这个问题,并且想要一些替代的简单代码,你可以尝试这样的方法:
std::vector<char> buffer{4};
std::ifstream source{argv[1], std::ios_base::binary};
source.read(buffer.data(), buffer.size());
相关文章:
- 我的神经网络不起作用 [XOR 问题]
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- C++为什么尽管我调用了void函数,它却不起作用
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 为什么二进制搜索在我的测试中不起作用
- 我的代码中有错误吗?使用BGI图形的C++代码对我不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- Bjarne Stroustrup Book - std_lib_facilities.h - 不起作用(未知类型名称)
- 为什么简单的算术减法在"if"条件下不起作用?
- 为什么Stroustup书中的has_f不起作用
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 嵌套While循环不起作用(C++问题)
- C++Matching Brackets 2解决方案不起作用
- 为什么unordered_set<string::iterator>不起作用?
- 为什么const_cast<iterator>(const_iterator)在Visual C++ 6.0中有效,而在Visual Studio .NET中不起作用?