Чтение файла в std::vector<unsigned char>
Как лучше читать файл в std::vector<unsigned char>:читать побайтово и добавлять в вектор, или делать один read а потом добавлять в вектор весь массив(передать указатель на начало и конец в виде итераторов)?
P.S. Но если ты будешь читать, и потом уже добавлять, то резервируй сразу размер вектора достаточно большой, иначе быстрое время добавления в конец будет ухудшено необходимостью перераспределения
памяти.
2. Зарезервировать в векторе достаточное место.
3. Прочитать весь файл за раз (вектор гарантирует последовательное размещение элементов).
А читать куда?Системный вызов read имеет параметр void *buf
FILE*f=fopen("...","rb");
fpos_t sz;
fseek(f,0,2);
fgetpos(f,&sz);
char* p=new char[sz];
fread(p,sz,1,f);
fclose(f);
/*что там тебе нужно*/
delete [] p;
ifstream in("somefile" , ios::binary);
и.т.д.
Вообще говоря, довольно странное использование вектора. Почему не воспользоваться обычными средствами?
Цитата: Lerkin
Вообще говоря, довольно странное использование вектора. Почему не воспользоваться обычными средствами?
Согласен, странновато. Но если надо его как-то хитро обрабатывать, файл, то почему бы и нет. Зачем нужные функции вручную писать?:)
Цитата: uighur
А читать куда?Системный вызов read имеет параметр void *buf
Да, собственно, в &vec.at(0). Вспоминаем, что в векторе элементы хранятся подряд, как в массиве.
Спасибо
Цитата: _const_
Да, собственно, в &vec.at(0). Вспоминаем, что в векторе элементы хранятся подряд, как в массиве.
Так как ты предлагаешь, можно, конечно, но раз автор использует STL - почему бы не использовать более удобные средства работы с файлами, чем "системный вызов read"? Почему не использовать потоковый ввод?
Через итераторы - проиграем в производительности. Через filebuf - скорее всего тоже. Да и метод этот вполне удобен (по-моему), разве что будут проблемы с переходом на другие контейнеры. А оно автору надо?
Ну насчет скорости - спорно, надо проверять. Но вообще, раз автору все равно - то верно, какой смысл попусту спорить:)