从文件中读取时使用Insert Iterators

时间:2010-09-25 19:57:35

标签: c++ file-io iterator

您可以在从文件读取时使用Insert Iterators将数据放入STL容器吗?

例如:

FILE *stream;
fread(back_inserter(std::list), sizeof(int), 1, stream);

2 个答案:

答案 0 :(得分:4)

C ++流与C stdio流不兼容。换句话说,您不能将C ++迭代器与FILE*fread一起使用。但是,如果您使用C ++ std::fstream工具和istream_iterator,则可以使用插入迭代器插入到C ++容器中。

假设您有一个输入文件“input.txt”,其中包含以空格分隔的ASCII文本编号,您可以这样做:

#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>

int main()
{
 std::ifstream ifs("input.txt");
 std::vector<int> vec;
    // read in the numbers from disk
 std::copy(std::istream_iterator<int>(ifs), std::istream_iterator<int>(), std::back_inserter(vec));
    // now output the integers
 std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, "\n"));
}

答案 1 :(得分:2)

不,你不能。从根本上讲,存储int就不那么容易了。如果您使用big-endian机器编写文件并尝试使用little-endian机器读取它,您的代码将会中断。

但没有人阻止你。只需定义自己的前向迭代器,它从istream中读取二进制文件。您可能希望停止使用FILE和fread / fopen / fclose函数,因为它们来自C时代。

然后你就可以写:

std::copy_n(your_custom_forward_iterator, count, back_inserter<std::list<....> >);