Использование Insert Iterators при чтении из файла - PullRequest
0 голосов
/ 25 сентября 2010

Вы можете использовать Insert Iterators при чтении из файла, чтобы поместить данные в контейнер STL?

например:

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

Ответы [ 2 ]

4 голосов
/ 26 сентября 2010

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"));
}
2 голосов
/ 26 сентября 2010

нет, ты не можешь. И это принципиально непереносимо для хранения int таким образом. Ваш код сломается, если вы напишите свой файл на машине с прямым порядком байтов и попытаетесь прочитать ее на машине с прямым порядком байтов.

Но никто не мешает вам. Просто определите свой собственный прямой итератор, который читает двоичный файл из istream. Скорее всего, вы захотите прекратить использовать функции FILE и fread / fopen / fclose, так как они относятся к эпохе C.

тогда вы сможете написать:

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