【发布时间】:2011-04-17 06:09:30
【问题描述】:
在从文件中读取数据时,您可以使用Insert Iterators 将数据放入 STL 容器吗?
例如:
FILE *stream;
fread(back_inserter(std::list), sizeof(int), 1, stream);
【问题讨论】:
在从文件中读取数据时,您可以使用Insert Iterators 将数据放入 STL 容器吗?
例如:
FILE *stream;
fread(back_inserter(std::list), sizeof(int), 1, stream);
【问题讨论】:
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"));
}
【讨论】:
std::copy_n。
不,你不能。像这样存储 int 从根本上说是不可移植的。如果您使用 big-endian 机器编写文件并尝试使用 little-endian 机器读取文件,您的代码将会中断。
但是没有人阻止你这样做。只需定义您自己的从 istream 读取二进制文件的前向迭代器。您可能希望停止使用来自 C 时代的 FILE 和 fread/fopen/fclose 函数。
然后你就可以写了:
std::copy_n(your_custom_forward_iterator, count, back_inserter<std::list<....> >);
【讨论】: