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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как максимально быстро сложить два динамических одномерных массива? SSE? http://www.cyberforum.ru/cpp-beginners/thread759746.html
Всем привет! Нужно максимально быстро сложить поэлементно два байтовых массива. Есть: unsigned char *buf1; unsigned char *buf2; unsigned char *buf3; buf1= new unsigned char; buf2= new unsigned char; buf3= new unsigned char; //чем-то заполняю. И теперь нужно:
C++ Удаление двухмерного массива Доброго дня. Выделяем память под квадратную матрицу --> заполняем --> освобождаем занятую память . Следующий вопрос : при повторном выделении памяти и заполнении . работа программы некорректна , а именно вывод на экран следующего : 0 1 0 1 1 0 1 0 1 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 153563520 -1 -1 0 153563532 0 0 0 0 0 0... http://www.cyberforum.ru/cpp-beginners/thread759705.html
В выходной фаил записываются вместе с ответом записываются каракули. Помогите исправить ошибку C++
#include <iostream> using namespace std; void funk (int n, int k) { freopen("input.txt", "rt", stdin); freopen("output.txt", "wt", stdout); cin>>n;
C++ Алгоритм шифрования Triple DEZ, Нужно дописать код DEZ в Triple DEZ
Есть исходный код С++ программы реализующей алгоритм DEZ , нужно переделать её в алгоритм Triple DEZ . Сдача через два дня, если можно то помочь до 14, крайний срок 15 числа. Спасибо большое. #include<stdio.h> #include<math.h> #include<limits.h> #include<string.h> #define N 17 #define M 28
C++ Реализация методов КИТ http://www.cyberforum.ru/cpp-beginners/thread759692.html
Не знаю как на С++ реализовать модифицированный метод Хаффмана на примере любого простейшего бинарного изображения!Если кто знает, помогите - не шарю...:(
C++ Определить, является ли последовательность корректной записью даты С клавиатуры задается последовательность символов. Написать программу, которая проверяет, является ли эта последовательность корректной записью даты (датой считаем запись, где первым указанное число, после - месяц, а потом год (4 или 2 цифры), причем разделителями могут быть символы «/», «.» И «-»). подробнее

Показать сообщение отдельно
classIFicator
Сообщений: n/a

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

12.01.2013, 18:43. Просмотров 736. Ответов 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]);
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru