С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
classIFicator
0 / 0 / 0
Регистрация: 24.10.2015
Сообщений: 1
#1

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

12.01.2013, 18:43. Просмотров 767. Ответов 2
Метки нет (Все метки)

Имеется программа, в которой происходит посимвольное чтение из файла в вектор:
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]);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2013, 18:43
Здравствуйте! Я подобрал для вас темы с ответами на вопрос STL, istream_iterator, в вектор считывается неверное количество символов (C++):

Строки: почему выводится неверное количество символов? - C++
Почему выводит количество символов 507, хотя массив равен 500 символов #include &lt;iostream&gt; int main() { using namespace std; ...

STL String. Вывести слово и после него количество символов - C++
Здраствуйте! У меня есть например строка string, покажите пожалуйста на примере как можно выделять слова этой строки, например вывести...

Ограничить количество символов, введённых в вектор - C++
Нужно каким-то образом огранить количество введённых символов в вектор, чтобы при превышении лимита символы начинали записываться в новый...

Вектор (не из STL) из структур - C++
привет Ребят, задача была поставлена так: нужно сделать прогу, которая бы считывала слова из файла, записывала и сортировала их в...

Вектор наподобие STL - C++
Закончил реализацию. Выкладываю, ибо может кому пригодится. + Кому не лень - пожалуйста просмотрите код, скажите, что плохо сделано, чего...

STL вектор динамических объектов - C++
Нужно время от времени ложить в std::vector (или std::list) динамические объекты. Под динамическим объектом здесь понимается объект,...

2
Avazart
Эксперт С++
7237 / 5433 / 304
Регистрация: 10.12.2010
Сообщений: 24,154
Записей в блоге: 17
12.01.2013, 20:27 #2
Ну наверно пробелы не читаются..

Добавлено через 2 минуты
http://www.cyberforum.ru/blogs/131347/custom19.html
1
classIFicator
0 / 0 / 0
Регистрация: 24.10.2015
Сообщений: 1
12.01.2013, 20:48 #3
Да, fin.unsetf( std::ios_base::skipws ); помогло, благодарю.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2013, 20:48
Привет! Вот еще темы с ответами:

Как устроен вектор (STL) ? - C++
Вот такой вот вопросец возник. Как организовано хранение вектора в памяти? Последовательно располагаются именно сами данные, или может быть...

создать вектор STL в классе - C++
Здравствуйте всем Вопрос касается STL векторов внутри класса. Ситуация такая: есть изображение (двухмерная матрица) био клеток. Нужно...

Библиотека STL, класс вектор - C++
Помогите написать прогу... вот задание: Использовать класс vector библиотеки STL для хранения каталога книг. Книги характеризуются...

Не считывается количество пробелов - C++
из файла считываю матрицу, в которой два столбца и много строк. для начала хочу считать количество пробелов в первой строчке. на выходе...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.