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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 66, средняя оценка - 4.67
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 10:59     Быстрое чтение файла #1
Здраствуйте. Я пишу программу, которая читает файлы порядка от нескольких килобайтов до максимум 3 Мб. Посоветуйте пожалуйста, какие функции и/или алгоритмы использовать для максимальнобыстрого чтения данных, представленных вещественными числами. Прошу прощения, если мой вопрос неправильно сформулирован.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.11.2011, 10:59     Быстрое чтение файла
Посмотрите здесь:

Быстрое чтение массива из файла C++
C++ Быстрое чтение и запись файлов
C++ как может корректно выполняющийся оператор >> (чтение из текстового файла) негативно влиять на открытие другого файла?
Чтение из файла. Повторное чтение файла C++
Быстрое создание пустого файла определенного размера C++
C++ Быстрое преобразование фурье wave файла
Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла. C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
 Аватар для Thinker
4216 / 2190 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 12:44     Быстрое чтение файла #2
Можно создать в памяти свой буфер и из файла (двоичного) данные считывать целыми кусками, если не весь файл целиком.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:33  [ТС]     Быстрое чтение файла #3
Если я правильно поняла, то ты предлагаешь предварительно загрузить данные из файла в массив, а потом получать данные из массива.
Thinker
Эксперт C++
 Аватар для Thinker
4216 / 2190 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:35     Быстрое чтение файла #4
Цитата Сообщение от programina Посмотреть сообщение
Если я правильно поняла, то ты предлагаешь предварительно загрузить данные из файла в массив, а потом получать данные из массива.
Именно, например, алгоритм быстрого копирования файлов через буфер:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#define LENGTH 1024    
 
int CopyFile(const char *fileNameIn, const char *fileNameOut)
{
   FILE *in, *out;
   char buf[LENGTH];
   long n;
   in = fopen(fileNameIn, "rb");
   out = fopen(fileNameOut, "wb");
   while (n = fread(buf, sizeof(char), LENGTH, in))
        fwrite(buf, sizeof(char), n, out);
   fcloseall();
   return 0;
}
P.S. Вот еще бы не тыкали, было бы здорово.
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 13:35     Быстрое чтение файла #5
Thinker, извините, что перебиваю вашу беседу... А разве потоки ввода-вывода C++ (и Си, кстати, тоже интересно) не буферизируют ввод, предварительно считывая кусок информации определённого размера из файла?
Thinker
Эксперт C++
 Аватар для Thinker
4216 / 2190 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:37     Быстрое чтение файла #6
Цитата Сообщение от talis Посмотреть сообщение
Thinker, извините, что перебиваю вашу беседу... А разве потоки ввода-вывода C++ (и Си, кстати, тоже интересно) не буферизируют ввод, предварительно считывая кусок информации определённого размера из файла?
Только символьные (текстовый формат) потоки автоматически буферизованы, а двоичные надо самим буферизовать
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:43  [ТС]     Быстрое чтение файла #7
Спасибо за ответы, но меня больше интересует, что будет быстрее fread, fscanf или что-нибудь еще есть чего я не знаю
Thinker
Эксперт C++
 Аватар для Thinker
4216 / 2190 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:45     Быстрое чтение файла #8
Цитата Сообщение от programina Посмотреть сообщение
Спасибо за ответы, но меня больше интересует, что будет быстрее fread, fscanf или что-нибудь еще есть чего я не знаю
fread для работы в двоичном формате, fscanf - в текстовом. Смотря как у вас информация хранится.
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:49  [ТС]     Быстрое чтение файла #9
А если я открою файл таким образом:
C++
1
FILE* fo = fopen("test.txt","rb");
я потом не смогу из него прочитать число c помощью fscanf, простите если вопрос тупой
Thinker
Эксперт C++
 Аватар для Thinker
4216 / 2190 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:53     Быстрое чтение файла #10
Цитата Сообщение от programina Посмотреть сообщение
А если я открою файл таким образом:
C++
1
FILE* fo = fopen("test.txt","rb");
я потом не смогу из него прочитать число, простите если вопрос тупой

Не по теме:


Нормальный вопрос, мы все всегда чему-нибудь учимся. Я многое не знаю, чего, быть может, знаете вы, поэтому не стоит себя принижать, все начинают с нуля.


Такой строкой вы открыли файл в двоичном формате. А файл вы будете сами создавать программно или через блокнот? fscanf не корректно прочитает, откройте тогда файл в текстовом формате.

C++
1
FILE* fo = fopen("test.txt","r");
и используйте fscanf
programina
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 14:02  [ТС]     Быстрое чтение файла #11
Thinker, спасибо вам большое.
Я в своей программе сделала чтение из файла с помощью fscanf. Файл пока текстовый, но я планировала использовать бинарные файлы. Поэтому перепишу свою прогу с fread.
Байт
 Аватар для Байт
14300 / 9131 / 1314
Регистрация: 24.12.2010
Сообщений: 16,692
11.11.2011, 14:02     Быстрое чтение файла #12
Цитата Сообщение от Thinker Посмотреть сообщение
Только символьные (текстовый формат) потоки автоматически буферизованы, а двоичные надо самим буферизовать
ИМХО, буферизация не зависит от вида (текстовой/байтовый) файла. Если я ошибаюсь, дайте ссылочку. В старинном, но очень хорошем справочнике по С
написано, что не буферизуются stdin, stdoun, если буфер специально не назначен.
и еще есть функция setvbuf устанавливающая размер буфера

Цитата Сообщение от programina Посмотреть сообщение
но меня больше интересует, что будет быстрее fread, fscanf
ИМХО, fread быстрее, он только читает, а fscanf еще и преобразует, и с форматами работает, причем эта работа нетривиальна. Но естественно, в файле должны содержаться двоичные данные.
Thinker
Эксперт C++
 Аватар для Thinker
4216 / 2190 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:10     Быстрое чтение файла #13
Байт, setvbuf для текстового формата. Конечно fread быстрее считывает, там же "сырые" байты информации. Буферизация зависит от формата, зачем же тогда при копировании файлов выделяют собственный буфер, а считывание по одному байту (без собственного буфера) оборачивается очень медленной работой программы. Можете эксперимент провести, скопируйте файл в двоичном виде с буфером и без. Если бы двоичные потоки буферизовались, то такого бы не было.
Байт
 Аватар для Байт
14300 / 9131 / 1314
Регистрация: 24.12.2010
Сообщений: 16,692
11.11.2011, 14:11     Быстрое чтение файла #14
Цитата Сообщение от Thinker Посмотреть сообщение
fcloseall();
А за эту функцию - спасибо! 20 лет программирую на Си, а про нее не знал
Thinker
Эксперт C++
 Аватар для Thinker
4216 / 2190 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:15     Быстрое чтение файла #15
Цитата Сообщение от Байт Посмотреть сообщение
А за эту функцию - спасибо! 20 лет программирую на Си, а про нее не знал

Не по теме:

А я только 2 года назад начал на Си писать по сравнению с вами я малявка, буду к вам прислушиваться

Байт
 Аватар для Байт
14300 / 9131 / 1314
Регистрация: 24.12.2010
Сообщений: 16,692
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++
 Аватар для Thinker
4216 / 2190 / 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
 Аватар для programina
1912 / 597 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 14:24  [ТС]     Быстрое чтение файла #18
Thinker и Байт, спасибо вам большое. Я узнала про буферизацию потока.
Thinker
Эксперт C++
 Аватар для Thinker
4216 / 2190 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:27     Быстрое чтение файла #19
Цитата Сообщение от programina Посмотреть сообщение
Thinker и Байт, спасибо вам большое. Я узнала про буферизацию потока.

Не по теме:


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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 14:29     Быстрое чтение файла
Еще ссылки по теме:

C++ Быстрое создание бинарного файла заданного размера
Быстрое считывание 32кб из файла 7гб C++
C++ Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Максимальное быстрое создание большого файла C++
Переделать в коде чтение из файла в чтение с клавиатуры C++

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

Или воспользуйтесь поиском по форуму:
Байт
 Аватар для Байт
14300 / 9131 / 1314
Регистрация: 24.12.2010
Сообщений: 16,692
11.11.2011, 14:29     Быстрое чтение файла #20
Цитата Сообщение от Thinker Посмотреть сообщение
_IOLBF Выполняется строчная буферизация. Реально ввод/вывод выполняется, когда читается или записывается новая строка.
Функция setvbuf может быть использована над любым открытым потоком для изменения типа буферизации. Параметр mode должен быть одним из трех следующих макросов:

_IONBF
(отключить буферизацию);
_IOLBF
(строчная буферизация);
_IOFBF
(блочная буферизация).
Мной тоже движет только жажда познания. Никаких отрицательных эмоций наша дискуссия у меня не вызывает.
Yandex
Объявления
11.11.2011, 14:29     Быстрое чтение файла
Ответ Создать тему
Опции темы

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