【问题标题】:Using Insert Iterators when reading from file从文件读取时使用插入迭代器
【发布时间】:2011-04-17 06:09:30
【问题描述】:

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

例如:

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

【问题讨论】:

    标签: c++ file-io iterator


    【解决方案1】:

    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"));
    }
    

    【讨论】:

    • 你能指定流的结尾,例如读取 5 个整数吗?
    • 是的,您可以使用包含计数参数的std::copy_n
    【解决方案2】:

    不,你不能。像这样存储 int 从根本上说是不可移植的。如果您使用 big-endian 机器编写文件并尝试使用 little-endian 机器读取文件,您的代码将会中断。

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

    然后你就可以写了:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      相关资源
      最近更新 更多