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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
nchameleon
2 / 2 / 1
Регистрация: 06.04.2010
Сообщений: 161
#1

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

31.03.2011, 18:43. Просмотров 1721. Ответов 4
Метки нет (Все метки)

Добрый день, появился вроде бы не сложный вопрос,
у меня есть динамический массив данных

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++
Здраствуйте. Я пишу программу, которая читает файлы порядка от нескольких килобайтов до максимум 3 Мб. Посоветуйте пожалуйста, какие...

Быстрое чтение и запись файлов - C++
Вопрос такой: имеется файл input.txt следующего вида: 5 12 6 7 44 2 1 2 3 4 5 2 343 634 54 1 123 2 345 56 56 11111 2222...

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

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

Чтение массива из файла - C++
Здравствуйте, подскажите, пожалуйста почему не происходит чтение из файла #include &lt;cstdlib&gt; #include &lt;iostream&gt; #include...

Чтение из файла массива - C++
Пожалуйста помогите разобрать чтение двумерного масиива из файла(не могу найти чтото понятное(

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Ma3a
Эксперт C++
616 / 460 / 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++
616 / 460 / 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
Эксперт С++
4934 / 2514 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
05.04.2011, 16:38 #5
nchameleon, если Вы уже использовали метод write, то почему у Вас не возникло мысли об использовании метода read?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2011, 16:38
Привет! Вот еще темы с ответами:

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

Чтение массива из файла - C++
Здравствуйте! Возникла проблема со считыванием матрицы... for(int i=0;i&lt;y;i++){ for(int j=0;j&lt;x;j++){ fi&gt;&gt;*(ptd+y*i+j); ...

Чтение массива из файла - C++
Здравствуйте, у меня есть массив arr, как я могу прочитать в него из файла следующую запись 0111000011 0000011011 0100011000 ...

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


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

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

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