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

Быстрое чтение массива из файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
nchameleon
2 / 2 / 1
Регистрация: 06.04.2010
Сообщений: 161
31.03.2011, 18:43     Быстрое чтение массива из файла #1
Добрый день, появился вроде бы не сложный вопрос,
у меня есть динамический массив данных

C++
1
2
3
4
5
6
7
double ** data; // пусть 200x500
//я его пишу в фаил 
std::ofstream FILE_SAVE_i;
FILE_SAVE_i.open(path_i.c_str());
for (int i=0; i < 200 ;i++)
    for (int j=0; j < 500 ;j++)
        FILE_SAVE_i.write(data[i][j]),sizeof(double));
а вот как считывать данные, придется по одному числу читать,
получиться более 100тыс. операций доступа к файлу, как-то получается многовато и долго, по идее

если читать файл блоками в массив charT[] то потом придется конвертировать используя постоянно memcpy(&number, &charT[k], sizeof(double));

может есть еще более быстрый и удобный вариант чтения данных ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2011, 18:43     Быстрое чтение массива из файла
Посмотрите здесь:

C++ Чтение массива из файла
C++ Чтение массива из файла
C++ Быстрое чтение и запись файлов
Быстрое чтение файла C++
C++ Чтение из файла массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
31.03.2011, 19:10     Быстрое чтение массива из файла #2
Можно читать весь файл в строку, используя итераторы istreambuf, дабы работать с буфером потока напрямую, без лишних проверок форматирования и прочего, чтоб каждое число по-отдельности не вводить, а всё сразу(работают они на несколько порядков быстрее,чем istream_iterator), потом загрузить всё это дело в stringstream и уже из него выводить поэлементно в нужный массив
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
std::string contents(
        (std::istreambuf_iterator<char>(
            *(std::auto_ptr<std::ifstream>(
                new std::ifstream("file")
            )).get()
        )), 
        std::istreambuf_iterator<char>()
    );
 
std::istringstream Slicer(contents);
 
for(int i = 0; i < 200; ++i)
    for(int j = 0; j < 500; ++j)
        Slicer >> data[i][j];
Добавлено через 4 минуты
насчет скорости, блочное чтение и такой подход на деле показывают довольно близкие результаты, но так лично для меня удобнее
nchameleon
2 / 2 / 1
Регистрация: 06.04.2010
Сообщений: 161
05.04.2011, 16:09  [ТС]     Быстрое чтение массива из файла #3
как то с примером совсем не понятно, можно его развернуть без использования функции и подробнее,)
Ma3a
Эксперт C++
612 / 456 / 31
Регистрация: 28.01.2011
Сообщений: 605
05.04.2011, 16:26     Быстрое чтение массива из файла #4
Не очень понял, о какой именно функции речь. Если более наглядно, то попробую так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// объявляем входной поток для файла с именем "file"
std::ifstream in("file");
// создаем итератор прямого доступа к буферу для этого потока
// просто-напросто читает побайтово из файлового потока
std::istreambuf_iterator<char> it(in);
// создаем строку, в которую считывается всё содержимое файла
std::string contents(it,std::istreambuf_iterator<char>());
 
// строковый поток, инициализированный строкой, куда переписали содержимое файла
// нужен для форматированного ввода чисел в массив
std::istringstream Slicer(contents);
 // а теперь , точно так же, как и, например, с std::cin, вводим из потока Slicer
// форматированным вводом числа в data[i][j]
for(int i = 0; i < 200; ++i)
        for(int j = 0; j < 500; ++j)
                Slicer >> data[i][j];
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
05.04.2011, 16:38     Быстрое чтение массива из файла #5
nchameleon, если Вы уже использовали метод write, то почему у Вас не возникло мысли об использовании метода read?
Yandex
Объявления
05.04.2011, 16:38     Быстрое чтение массива из файла
Ответ Создать тему
Опции темы

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