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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 66, средняя оценка - 4.67
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

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

11.11.2011, 10:59. Просмотров 8998. Ответов 71
Метки нет (Все метки)

Здраствуйте. Я пишу программу, которая читает файлы порядка от нескольких килобайтов до максимум 3 Мб. Посоветуйте пожалуйста, какие функции и/или алгоритмы использовать для максимальнобыстрого чтения данных, представленных вещественными числами. Прошу прощения, если мой вопрос неправильно сформулирован.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2011, 10:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Быстрое чтение файла (C++):

Быстрое чтение массива из файла - C++
Добрый день, появился вроде бы не сложный вопрос, у меня есть динамический массив данных double ** data; // пусть 200x500 //я его...

Быстрое чтение и запись файлов - 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++
Здравствуйте! Возникла проблема в работе с большим файлом: возникла необходимость быстро заполнять некоторый участок большого файла...

Быстрое считывание 32кб из файла 7гб - C++
Есть бинарный файл размером 6,95 ГБ, он представляет из себя массив short. Необходимо быстро считать случайные 65536 шортов. Т.к. весь файл...

Быстрое преобразование фурье wave файла - C++
Всем доброго времени суток! Сейчас работаю над дипломом, в c++ как и в обработке звука пока новичок. На данном этапе мне необходимо...

Максимальное быстрое создание большого файла - C++
У кого какие алгоритмы создания максимально быстро файлов, больших размеров?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Байт
Эксперт C
15995 / 10263 / 1537
Регистрация: 24.12.2010
Сообщений: 19,358
11.11.2011, 14:18 #16
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Thinker Посмотреть сообщение
Байт, setvbuf для текстового формата. Конечно fread быстрее считывает, там же "сырые" байты информации. Буферизация зависит от формата, зачем же тогда при копировании файлов выделяют собственный буфер, а считывание по одному байту (без собственного буфера) оборачивается очень медленной работой программы. Можете эксперимент провести, скопируйте файл в двоичном виде с буфером и без. Если бы двоичные потоки буферизовались, то такого бы не было.
Вот нашел
http://www.codenet.ru/progr/cpp/sprd/setvbuf.php
http://www.opennet.ru/man.shtml?topi...ry=3&russian=0

ни слова о виде файла нету!
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:21 #17
Цитата Сообщение от Байт Посмотреть сообщение
Вот нашел
http://www.codenet.ru/progr/cpp/sprd/setvbuf.php
http://www.opennet.ru/man.shtml?topi...ry=3&russian=0

ни слова о виде файла нету!
А примеры с fprintf не наводят на мысль и в каком формате файл открывают? Байт, поймите только правильно, это не спор, просто самому очень-очень интересно А как вам эта выдержка из вашей ссылки:

_IOLBF Выполняется строчная буферизация. Реально ввод/вывод выполняется, когда читается или записывается новая строка.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 14:24  [ТС] #18
Thinker и Байт, спасибо вам большое. Я узнала про буферизацию потока.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:27 #19
Цитата Сообщение от programina Посмотреть сообщение
Thinker и Байт, спасибо вам большое. Я узнала про буферизацию потока.

Не по теме:


Это хорошо, но в двоичных потоках нет буферизации. Столкнулся с этим, когда серьезные и быстрые программы шифрования писал.

Байт
Эксперт C
15995 / 10263 / 1537
Регистрация: 24.12.2010
Сообщений: 19,358
11.11.2011, 14:29 #20
Цитата Сообщение от Thinker Посмотреть сообщение
_IOLBF Выполняется строчная буферизация. Реально ввод/вывод выполняется, когда читается или записывается новая строка.
Функция setvbuf может быть использована над любым открытым потоком для изменения типа буферизации. Параметр mode должен быть одним из трех следующих макросов:

_IONBF
(отключить буферизацию);
_IOLBF
(строчная буферизация);
_IOFBF
(блочная буферизация).
Мной тоже движет только жажда познания. Никаких отрицательных эмоций наша дискуссия у меня не вызывает.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:32 #21
Строчная буферизация это когда строки до '\n' накапливаются, а потом целиком записываются, а блочная это когда не будет заполнен целиком буфер
Байт
Эксперт C
15995 / 10263 / 1537
Регистрация: 24.12.2010
Сообщений: 19,358
11.11.2011, 14:37 #22
Цитата Сообщение от programina Посмотреть сообщение
Thinker и Байт, спасибо вам большое. Я узнала про буферизацию потока.
Мой вам совет. Сделайте буфер побольше. И читайте столько, сколько нужно для нормальной логики программы. Хоть по одному числу.
C
1
2
3
4
5
6
7
8
FILE *f; double d; int size = sizeof(double);
f = fopen("nfvt", "rb");
setvbuf(f, NULL, _IOFBF, 10400);
while(1) {
  if (fread(&d, 1, size, f)<size) break;
  .......
}
fclose(f);
Если, конечно, в нашей дискуссии с Thinker прав окажусь я
Charles Kludge
Клюг
7630 / 3145 / 363
Регистрация: 03.05.2011
Сообщений: 8,383
11.11.2011, 14:37 #23
IMHO, для ДОСи можно использовать
C
1
2
#include <stdio.h>
void setbuf( FILE *fp, char *buffer );
The setbuf function can be used to associate a buffer with the file designated by fp. If this function is used, it must be called after the file has been opened and before it has been read or written. If the argument buffer is
NULL, then all input/output for the file fp will be completely unbuffered. If the argument buffer is not NULL, then it must point to an array that is at least BUFSIZ characters in length, and all input/output will be fully buffered.
и
C
1
2
3
4
5
#include <stdio.h>
int setvbuf( FILE *fp,
             char *buf,
             int mode,
             size_t size );
The setvbuf function can be used to associate a buffer with the file designated by fp. If this function is used, it must be called after the file has been opened and before it has been read or written. The argument mode determines how the file fp will be buffered, as follows:


Mode Meaning

_IOFBF

causes input/output to be fully buffered.


_IOLBF

causes output to be line buffered (the buffer will be flushed when a new-line character is written, when the buffer is full, or when input is requested on a line buffered or unbuffered stream).


_IONBF

causes input/output to be completely unbuffered.

If the argument buf is not NULL, the array to which it points will be used instead of an automatically allocated buffer. The argument size specifies the size of the array.
А под виндой
C
1
2
3
4
5
6
7
8
9
HANDLE CreateFileMapping(
 
    HANDLE hFile,   // handle to file to map 
    LPSECURITY_ATTRIBUTES lpFileMappingAttributes,  // optional security attributes 
    DWORD flProtect,    // protection for mapping object 
    DWORD dwMaximumSizeHigh,    // high-order 32 bits of object size  
    DWORD dwMaximumSizeLow, // low-order 32 bits of object size  
    LPCTSTR lpName  // name of file-mapping object 
   );
и иже с ним.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:40 #24
Цитата Сообщение от Байт Посмотреть сообщение
Сделайте буфер побольше.
Только если он в стек поместится, а то можно динамический массив создать и работать с "rb" или "wb".
Байт
Эксперт C
15995 / 10263 / 1537
Регистрация: 24.12.2010
Сообщений: 19,358
11.11.2011, 14:42 #25
Цитата Сообщение от Thinker Посмотреть сообщение
Это хорошо, но в двоичных потоках нет буферизации. Столкнулся с этим, когда серьезные и быстрые программы шифрования писал.
Отложим дискуссию. Вот придумаю грамотный эксперимент, посмотрим.
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:43 #26
Цитата Сообщение от Байт Посмотреть сообщение
Отложим дискуссию. Вот придумаю грамотный эксперимент, посмотрим.
Ок, советую с копированием файлов
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 14:44 #27
Цитата Сообщение от Charles Kludge Посмотреть сообщение
CreateFileMapping
Мне казалось, что она просто "выводит" файл в адресное пространство программы. Про буферизацию я ничего на msdn не увидел
Байт
Эксперт C
15995 / 10263 / 1537
Регистрация: 24.12.2010
Сообщений: 19,358
11.11.2011, 14:45 #28
Цитата Сообщение от Thinker Посмотреть сообщение
Только если он в стек поместится, а то можно динамический массив создать и работать с "rb" или "wb".
setvbuf при втором параметре = NULL сам выделяет память посредством
malloc, т.е. в динамической памяти
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:47 #29
Цитата Сообщение от Байт Посмотреть сообщение
setvbuf при втором параметре = NULL сам выделяет память посредством
malloc, т.е. в динамической памяти
Я про собственный буфер, мы же дискутируем, что setbuf для двоичного формата не подходит, поэтому со своей стороны предлагаю свой динамический буфер создать
-=ЮрА=-
Заблокирован
Автор FAQ
11.11.2011, 15:01 #30
Цитата Сообщение от programina Посмотреть сообщение
Здраствуйте. Я пишу программу, которая читает файлы порядка от нескольких килобайтов до максимум 3 Мб. Посоветуйте пожалуйста, какие функции и/или алгоритмы использовать для максимальнобыстрого чтения данных, представленных вещественными числами. Прошу прощения, если мой вопрос неправильно сформулирован.
- файл совсем маханький предлагаю всё его содержимое сразу впихнуть в буффер, а затем уже работать с алгоритмами для строки или чего вы там хотите реализовать!Работа с буффером будет куда более быстрой чем парсинг файлового потока!Да и файл можно без опасения переписать, все данные то в буфере
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
long sLen;
char *s;
FILE * f = fopen("fPath","rb");//да rb - не будет граблей с \r\n
if(f)
{
    fseek(f,0,SEEK_END);//Курсор вконец
    sLen = ftell(f);//Узнаём длинну файла
    fseek(f,0,SEEK_SET);//Курсор вначала
    if(!(str = (char *)malloc(sizeof(char) * (sLen + 1))))
           printf("Allocation memory error\n");
    else
    {
          fread(s,sLen,1,f);
          s[sLen] = '\0';//Завершили строку
    }
    fclose(f);//Закрыли файловый поток
    if(s)
   {
           //работаем с инфойфайла
   }
}
Добавлено через 5 минут
Чтобы перебить строку в вещественные числа strtok-ом парсим токены идущие через пробел
char delim[] = " ";
C
1
2
3
4
5
6
char * tok = strtok(str,delim);
while(tok)
{
    arr[i++] = atof(tok);
    tok = strtok(str,delim);
}
Добавлено через 1 минуту
Ну а на плюсах можно всем что выше написал не заморачиваться и сделать вот так
программа с динамической памятью
тут уже готовый проект считывания ifstream-ом
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 15:01
Привет! Вот еще темы с ответами:

Быстрое создание пустого файла определенного размера - C++
Добрый день Столкнулся с проблемой как можно очень быстро создать файл на жестком диске, заполнены нулями (или мусором) за малый...

Быстрое создание бинарного файла заданного размера - C++
Собственно, вопрос в теме. Как быстро выделить память под файл? Можно, конечно, методично записать в файл массив необходимого размера, но...

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

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


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

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

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