Форум программистов, компьютерный форум CyberForum.ru

STL, istream_iterator, в вектор считывается неверное количество символов - C++

Восстановить пароль Регистрация
 
classIFicator
Сообщений: n/a
12.01.2013, 18:43     STL, istream_iterator, в вектор считывается неверное количество символов #1
Имеется программа, в которой происходит посимвольное чтение из файла в вектор:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <fstream>
#include <iostream>
#include <vector>
#include <iterator>
 
char * buffer;
size_t file_length;
size_t size1, size2, size3;
std::vector<char> vector_file1, vector_file2;
// Открываем файл в двоичном режиме
std::ifstream fin("file.txt", ios::in | ios::binary );
std::istream_iterator<char> file_read_iterator(fin), eof;
 
 
if(fin.is_open())
{
    fin.seekg(0, ios::end);
    // Определяем длину файла
    file_length = fin.tellg();
    fin.seekg(0, ios::beg);     
    // Читаем весь файл в массив не используя итераторов
    buffer = new char[file_length+1];   
    fin.clear();
    fin.read(buffer, file_length);
    if(fin)
    {
        // Чтение при помощи итератора istream_iterator
        fin.seekg(0, ios::beg);
        // 1 Вариант:       
        std::vector<char> exp_vector1(file_read_iterator, eof);
        size1 = static_cast<size_t>(exp_vector1.size());
        fin.clear();
        fin.seekg(0, ios::beg);     
        // file_length > size1;
 
        
        // 2 Вариант:
        std::copy(std::istream_iterator<char> (fin),
        std::istream_iterator<char> (), std::back_inserter(vector_file1) );
        size2 = static_cast<size_t>(vector_file1.size());
        fin.clear();
        fin.seekg(0, ios::beg);     
        // file_length > size2
        
        // 3 Вариант:       
        while(file_read_iterator != eof)
                vector_file2.push_back(*file_read_iterator++);
        size3 = static_cast<size_t>(vector_file2.size());
        // file_length > size3
        // size1 == size2 == size3
    
    }
}
Проблема заключается в том, что размер файла, получаемый функцией tellg(), не совпадает с размером вектора, который заполняется при помощи итератора потокового ввода istream_iterator.
При сравнении содержимого масива buffer и векторов, обнаруживается, что некоторые символы в вектор не помещаются, и, как следствие, элементов в векторе меньше, чем символов в файле.
Что можно сделать с istream_iterator-ом, чтобы не приходилось прибегать к таким конструкциям:?
C++
1
2
3
4
for (size_t index = 0; index != file_length; ++index)
{
    vector_file.push_back(buffer[index]);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2013, 18:43     STL, istream_iterator, в вектор считывается неверное количество символов
Посмотрите здесь:

C++ создать вектор STL в классе
C++ Библиотека STL, класс вектор
Вектор наподобие STL C++
Как устроен вектор (STL) ? C++
STL String. Вывести слово и после него количество символов C++
STL вектор динамических объектов C++
Вектор (не из STL) из структур C++
C++ Ограничить количество символов, введённых в вектор

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6893 / 5133 / 250
Регистрация: 10.12.2010
Сообщений: 22,560
Записей в блоге: 17
12.01.2013, 20:27     STL, istream_iterator, в вектор считывается неверное количество символов #2
Ну наверно пробелы не читаются..

Добавлено через 2 минуты
http://www.cyberforum.ru/blogs/131347/custom19.html
classIFicator
Сообщений: n/a
12.01.2013, 20:48     STL, istream_iterator, в вектор считывается неверное количество символов #3
Да, fin.unsetf( std::ios_base::skipws ); помогло, благодарю.
Yandex
Объявления
12.01.2013, 20:48     STL, istream_iterator, в вектор считывается неверное количество символов
Ответ Создать тему
Опции темы

Текущее время: 09:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru