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

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

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

Чтение данных из файла в вектор - C++

15.04.2014, 17:04. Просмотров 1228. Ответов 12
Метки нет (Все метки)

Доброго времени суток. Никак не могу разобраться, поиск по форуму не помог.
У меня есть функция сохранения вектора в файл
C++
1
2
3
4
if (SaveDialog1->Execute()){
    std::ofstream output_file(SaveDialog1->FileName.c_str());
    std::ostream_iterator<int> output_iterator(output_file,"\n");
    std::copy(dataAll.begin(), dataAll.end(), output_iterator);  }
при том что вектор:
C++
1
std::vector <unsigned char> dataAll;
Сохранило построчно, окей.
Теперь проблема считать с файла в тот же вектор. Что только не пробовал..
C++
1
2
3
4
5
if (OpenDialog1->Execute()){
ifstream in_file (OpenDialog1->FileName.c_str());
unsigned char *buffer = new unsigned char[255];;
while (in_file >> buffer)
dataAll.push_back(*buffer);
C++
1
2
3
4
5
6
7
if (OpenDialog1->Execute()){
        string str ;
    ifstream in(OpenDialog1->FileName.c_str());
    while (in >> str) {
    for(unsigned i=0;i<str.size();i++)
        a+=str[i];
        dataAll.push_back(a); }
Он то читает, но читает какие-то левые значения. Вывожу на экран весь вектор и получается совсем не то.
Вроде, должно быть 1 а читает 49.
Файл:
Что в файлеЧто читает
149
149
149
149

Странно, спрашивал до этого, меня смогли только обвинить в неграмотности, а помочь так и не помогли. Неужели это такая невыполнимая задача? Как мне получить мою 1 в векторе в unsigned char? Я только учусь поэтому свое "ФЭ" будьте добры оставляйте у порога.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.04.2014, 17:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение данных из файла в вектор (C++):

Чтение из файла в вектор - C++
Доброго времени суток! Подскажите, пожалуйста, пишу как казалось довольно простую программу, требуется из файла матрицу считать и потом с...

Запись и Чтение из файла Вектор - C++
Не могу никак разобраться как записывать в файл вектор. Раньше записывал дин. массивы, структуры. а с векторами беда. Вот тут придумал...

чтение из файла в вектор по 1 слову - C++
Как сделать, чтобы на каждый итератор i было отдельное слово, а не целая строка? слова отделены пробелами vector&lt;string&gt; arr; ...

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

Посимвольное чтение файла в вектор - C++
Вечер добрый. Есть файл sir.in.txt, содержащий строку ABC; посимвольно записываю его в вектор следующим образом: ifstream...

Чтение текстового файла в вектор типа char - C++
Имеется текстовый файл. Необходимо прочитать его ПОЛНОСТЬЮ, включая все символы переноса строки (и 0A и 0D), все пробелы, нулевые символы...

12
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.04.2014, 17:19 #2
А если так:
C++
1
std::vector<int> v( (std::istream_iterator<int>(in_file)), std::istream_iterator<int>() );
1
Zerorc
1 / 1 / 0
Регистрация: 14.03.2014
Сообщений: 45
15.04.2014, 17:29  [ТС] #3
C++
1
2
3
4
5
6
if (OpenDialog1->Execute()){
        string tmp ;
    vector < string > a;
    ifstream in(OpenDialog1->FileName.c_str());
    std::vector<int> v( (std::istream_iterator<int>(in)), std::istream_iterator<int>() );
    dataAll.assign(v.begin(),v.end());
Заработало, вектор заполнен.
А теперь обьясните что тут делается, если можно.
C++
1
std::vector<int> v( (std::istream_iterator<int>(in_file)), std::istream_iterator<int>() );
0
DiffEreD
1430 / 767 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
15.04.2014, 17:34 #4
Это, так званый, интервальный конструктор std::vector. Простая инициализация.
C++
1
2
3
template< class InputIt >
vector( InputIt first, InputIt last, 
        const Allocator& alloc = Allocator() );
(constructor)
0
Zerorc
1 / 1 / 0
Регистрация: 14.03.2014
Сообщений: 45
16.04.2014, 09:14  [ТС] #5
Спасибо, посидел, голову поломал, но все таки начал разбираться. В принципе при загрузке не имеет значения в какой вектор помещу данные, если после уничтожу переменный вектор int, послуживший буфером.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.04.2014, 09:49 #6
Цитата Сообщение от Zerorc Посмотреть сообщение
Что только не пробовал..
Цитата Сообщение от Zerorc Посмотреть сообщение
Странно, спрашивал до этого, меня смогли только обвинить в неграмотности, а помочь так и не помогли. Неужели это такая невыполнимая задача?
C++
1
2
3
4
5
6
7
8
9
10
11
12
    std::vector <unsigned char> dataAll;
...
    if (SaveDialog1->Execute()){
    std::ofstream output_file(SaveDialog1->FileName.c_str());
    std::ostream_iterator<unsigned char> output_iterator(output_file,"\n");
    std::copy(dataAll.begin(), dataAll.end(), output_iterator);  }
    
    if (OpenDialog1->Execute()){
    ifstream in_file (OpenDialog1->FileName.c_str());
    unsigned char buffer;
    while (in_file >> buffer)
        dataAll.push_back(buffer);}
0
Ilot
Модератор
Эксперт С++
1818 / 1176 / 232
Регистрация: 16.05.2013
Сообщений: 3,105
Записей в блоге: 5
Завершенные тесты: 1
16.04.2014, 09:58 #7
Цитата Сообщение от Zerorc Посмотреть сообщение
Вроде, должно быть 1 а читает 49.
Попробуйте ответить на вопрос: какое число выведется в консоль?
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
using std::cout;
using std::endl;
int main()
{
    unsigned char ch = '1';
    int i = static_cast<int>(ch);
    cout << i << endl;
    return 0;
}
Цитата Сообщение от Zerorc Посмотреть сообщение
Странно, спрашивал до этого, меня смогли только обвинить в неграмотности, а помочь так и не помогли. Неужели это такая невыполнимая задача?
Ответ на этот вопрос вы узнате скомпилировав программу. Если не поймете спросите - объясню. Просто не хочу лишать вас радости открытий.
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
16.04.2014, 11:58 #8
Цитата Сообщение от Zerorc Посмотреть сообщение
C++
1
std::ostream_iterator<int> output_iterator(output_file,"\n");
Зачем итератор для int, если в файл записываются unsigned char?
Цитата Сообщение от Zerorc Посмотреть сообщение
C++
1
2
3
unsigned char *buffer = new unsigned char[255];;
while (in_file >> buffer)
dataAll.push_back(*buffer);
Зачем чтение в строку, если в файле unsigned char?
0
Zerorc
1 / 1 / 0
Регистрация: 14.03.2014
Сообщений: 45
18.04.2014, 09:39  [ТС] #9
Это явное приведение типа, вот только не совсем понял как из 1 получается 49 =( Что именно случается понятно, но как меняются биты, если из int в char переливаем? По какому принципу?

Добавлено через 58 секунд
Я просто передрал код по примеру, теперь немного разобрался, поменял типы.
0
Ilot
Модератор
Эксперт С++
1818 / 1176 / 232
Регистрация: 16.05.2013
Сообщений: 3,105
Записей в блоге: 5
Завершенные тесты: 1
18.04.2014, 10:39 #10
Цитата Сообщение от Zerorc Посмотреть сообщение
Это явное приведение типа, вот только не совсем понял как из 1 получается 49 =( Что именно случается понятно, но как меняются биты, если из int в char переливаем? По какому принципу?
Вы читаете файл как поток символов типа char, а выводите тип int. Где происходит это в программе можно сказать только узрев весь код, который вы так и не представили.
Далее есть символ '1', а есть цифра 1. У символа есть кодировка т.е. каким целым числом он представляется. Для '1' это 49. Что бы полностью понять различие символов и цифр запустите следующую программу.
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <iomanip>
using std::cout;
using std::endl;
int main()
{
    for (int k = 0; k < 0xFF; ++k)
        cout << std::setw(3) << k << std::setw(4) << static_cast<unsigned char>(k) << endl;
    return 0;
}
В первой колонке будут находится цифры во второй символы. Вот и посмотрите где находится ваша '1'.
1
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.04.2014, 11:04 #11
Цитата Сообщение от Zerorc Посмотреть сообщение
Это явное приведение типа,
Это, как-раз, не явное приведение типов.
0
Zerorc
1 / 1 / 0
Регистрация: 14.03.2014
Сообщений: 45
22.04.2014, 09:36  [ТС] #12
Ilot,
Вот, спасибо, теперь понял, начал разбираться =)

alsav22,
А по поводу неявного приведения типов, разве его не выполняет компилятор, автоматически? А при явном мы сами указываем это. Или я не прав? Потому что Википедия утверждает то же самое. xxx_cast<type_to>(expression_from)
0
alsav22
5421 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 09:41 #13
Цитата Сообщение от Zerorc Посмотреть сообщение
А по поводу неявного приведения типов, разве его не выполняет компилятор, автоматически? А при явном мы сами указываем это. Или я не прав?
Правы. Вот это по поводу какого поста было?
Цитата Сообщение от Zerorc Посмотреть сообщение
Это явное приведение типа,
Я посчитал, что вы мне ответили, а вы, наверное, не мне.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2014, 09:41
Привет! Вот еще темы с ответами:

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. - C++
#include&lt;iostream&gt; #include&lt;fstream&gt; #include&lt;locale.h&gt; #include&lt;iomanip&gt; #include &lt;cstdlib&gt; using namespace std; struct...

Чтение из файла определённого места и сортировка данных исходя из этих данных - C++
Есть некий текстовый документ, содержащий информацию о посещении сайта в формате: Например 12.5.76.200 04:23 Mon Цель:...

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

Чтение данных из файла С++ - C++
Здравствуйте. Дан простой пример потокового ввода/вывода дисковых файлов из Лафоре ООП С++. // форматированный вывод в файл //...


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

Или воспользуйтесь поиском по форуму:
13
Yandex
Объявления
22.04.2014, 09:41
Ответ Создать тему
Опции темы

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