这个答案 https://stackoverflow.com/a/13665583/2485710指出 C++ 不太适合对二进制文件进行迭代这一事实,但这正是我现在所需要的,简而言之,我需要以“二进制”方式操作文件,是的,所有文件都是二进制的,即使是 . txt 的,但我正在编写一些对图像文件进行操作的东西,因此我需要读取结构良好的文件,并且数据以特定方式排列。
我想读取数据结构中的整个文件,例如std::vector<T>
所以我几乎可以立即关闭文件并处理内存中的内容,而无需再关心磁盘 I/O。
目前,根据标准库对文件执行完整迭代的最佳方法是:
std::ifstream ifs(filename, std::ios::binary);
for (std::istreambuf_iterator<char, std::char_traits<char> > it(ifs.rdbuf());
it != std::istreambuf_iterator<char, std::char_traits<char> >(); it++) {
// do something with *it;
}
ifs.close();
or use std::copy
,但即使有std::copy
你总是在使用istreambuf
迭代器(所以如果我正确理解 C++ 文档,那么基本上每次调用之前的代码都会读取 1 个字节)。
所以问题是:如何编写自定义迭代器?我应该从哪里继承?
我认为这在将文件写入磁盘时也很重要,并且我认为我可以使用相同的迭代器类进行写入,如果我错了,请随时纠正我。
是可以优化的std::copy()
using std::istreambuf_iterator<char>
但几乎没有任何实现可以做到这一点。仅仅从某些东西派生也不会真正起作用,因为这不是迭代器的工作方式。
最有效的内置方法可能是将文件简单地转储到std::ostringstream
并得到一个std::string
从那里:
std::ostringstream out;
out << file.rdbuf();
std::string content = out.str();
如果您想避免旅行经过std::string
您可以编写一个流缓冲区,直接将内容转储到内存区域或std::vector<unsigned char>
并使用上面的输出操作。
The std::istreambuf_iterator<char>
原则上,s 可以有一个流缓冲区的后门并绕过字符操作。如果没有后门,您将无法使用这些迭代器来加速任何事情。你could使用流缓冲区的顶部创建一个迭代器sgetn()
处理类似的缓冲区。在这种情况下,你几乎需要一个版本std::copy()
有效地处理段(即缓冲区的每次填充)。如果没有的话,我只需使用流缓冲区将文件读入缓冲区并对其进行迭代。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)