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

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

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

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

15.04.2014, 17:04. Просмотров 1086. Ответов 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? Я только учусь поэтому свое "ФЭ" будьте добры оставляйте у порога.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1427 / 764 / 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>() );
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>() );
DiffEreD
1427 / 764 / 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)
Zerorc
1 / 1 / 0
Регистрация: 14.03.2014
Сообщений: 45
16.04.2014, 09:14  [ТС]     Чтение данных из файла в вектор #5
Спасибо, посидел, голову поломал, но все таки начал разбираться. В принципе при загрузке не имеет значения в какой вектор помещу данные, если после уничтожу переменный вектор int, послуживший буфером.
alsav22
5415 / 4811 / 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);}
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 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 Посмотреть сообщение
Странно, спрашивал до этого, меня смогли только обвинить в неграмотности, а помочь так и не помогли. Неужели это такая невыполнимая задача?
Ответ на этот вопрос вы узнате скомпилировав программу. Если не поймете спросите - объясню. Просто не хочу лишать вас радости открытий.
alsav22
5415 / 4811 / 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?
Zerorc
1 / 1 / 0
Регистрация: 14.03.2014
Сообщений: 45
18.04.2014, 09:39  [ТС]     Чтение данных из файла в вектор #9
Это явное приведение типа, вот только не совсем понял как из 1 получается 49 =( Что именно случается понятно, но как меняются биты, если из int в char переливаем? По какому принципу?

Добавлено через 58 секунд
Я просто передрал код по примеру, теперь немного разобрался, поменял типы.
Ilot
Модератор
Эксперт С++
1785 / 1160 / 225
Регистрация: 16.05.2013
Сообщений: 3,056
Записей в блоге: 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'.
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
18.04.2014, 11:04     Чтение данных из файла в вектор #11
Цитата Сообщение от Zerorc Посмотреть сообщение
Это явное приведение типа,
Это, как-раз, не явное приведение типов.
Zerorc
1 / 1 / 0
Регистрация: 14.03.2014
Сообщений: 45
22.04.2014, 09:36  [ТС]     Чтение данных из файла в вектор #12
Ilot,
Вот, спасибо, теперь понял, начал разбираться =)

alsav22,
А по поводу неявного приведения типов, разве его не выполняет компилятор, автоматически? А при явном мы сами указываем это. Или я не прав? Потому что Википедия утверждает то же самое. xxx_cast<type_to>(expression_from)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2014, 09:41     Чтение данных из файла в вектор
Еще ссылки по теме:

Запись и Чтение из файла Вектор C++
C++ чтение из файла в вектор по 1 слову
Чтение из файла определённого места и сортировка данных исходя из этих данных C++
C++ Чтение из файла в вектор
Вектор структур, ввод данных из файла C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5415 / 4811 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.04.2014, 09:41     Чтение данных из файла в вектор #13
Цитата Сообщение от Zerorc Посмотреть сообщение
А по поводу неявного приведения типов, разве его не выполняет компилятор, автоматически? А при явном мы сами указываем это. Или я не прав?
Правы. Вот это по поводу какого поста было?
Цитата Сообщение от Zerorc Посмотреть сообщение
Это явное приведение типа,
Я посчитал, что вы мне ответили, а вы, наверное, не мне.
Yandex
Объявления
22.04.2014, 09:41     Чтение данных из файла в вектор
Ответ Создать тему
Опции темы

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