Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.61/56: Рейтинг темы: голосов - 56, средняя оценка - 4.61
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
1

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

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

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

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

Быстрое чтение и запись файлов
Вопрос такой: имеется файл input.txt следующего вида: 5 12 6 7 44 2 1 2...

Быстрое заполнение большого файла
Здравствуйте! Возникла проблема в работе с большим файлом: возникла...

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

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

71
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 12:44 2
Можно создать в памяти свой буфер и из файла (двоичного) данные считывать целыми кусками, если не весь файл целиком.
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:33  [ТС] 3
Если я правильно поняла, то ты предлагаешь предварительно загрузить данные из файла в массив, а потом получать данные из массива.
0
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 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. Вот еще бы не тыкали, было бы здорово.
2
talis
793 / 545 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 13:35 5
Thinker, извините, что перебиваю вашу беседу... А разве потоки ввода-вывода C++ (и Си, кстати, тоже интересно) не буферизируют ввод, предварительно считывая кусок информации определённого размера из файла?
1
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:37 6
Цитата Сообщение от talis Посмотреть сообщение
Thinker, извините, что перебиваю вашу беседу... А разве потоки ввода-вывода C++ (и Си, кстати, тоже интересно) не буферизируют ввод, предварительно считывая кусок информации определённого размера из файла?
Только символьные (текстовый формат) потоки автоматически буферизованы, а двоичные надо самим буферизовать
3
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:43  [ТС] 7
Спасибо за ответы, но меня больше интересует, что будет быстрее fread, fscanf или что-нибудь еще есть чего я не знаю
0
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:45 8
Цитата Сообщение от programina Посмотреть сообщение
Спасибо за ответы, но меня больше интересует, что будет быстрее fread, fscanf или что-нибудь еще есть чего я не знаю
fread для работы в двоичном формате, fscanf - в текстовом. Смотря как у вас информация хранится.
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:49  [ТС] 9
А если я открою файл таким образом:
C++
1
FILE* fo = fopen("test.txt","rb");
я потом не смогу из него прочитать число c помощью fscanf, простите если вопрос тупой
0
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 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
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 14:02  [ТС] 11
Thinker, спасибо вам большое.
Я в своей программе сделала чтение из файла с помощью fscanf. Файл пока текстовый, но я планировала использовать бинарные файлы. Поэтому перепишу свою прогу с fread.
0
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
11.11.2011, 14:02 12
Цитата Сообщение от Thinker Посмотреть сообщение
Только символьные (текстовый формат) потоки автоматически буферизованы, а двоичные надо самим буферизовать
ИМХО, буферизация не зависит от вида (текстовой/байтовый) файла. Если я ошибаюсь, дайте ссылочку. В старинном, но очень хорошем справочнике по С
написано, что не буферизуются stdin, stdoun, если буфер специально не назначен.
и еще есть функция setvbuf устанавливающая размер буфера

Цитата Сообщение от programina Посмотреть сообщение
но меня больше интересует, что будет быстрее fread, fscanf
ИМХО, fread быстрее, он только читает, а fscanf еще и преобразует, и с форматами работает, причем эта работа нетривиальна. Но естественно, в файле должны содержаться двоичные данные.
1
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:10 13
Байт, setvbuf для текстового формата. Конечно fread быстрее считывает, там же "сырые" байты информации. Буферизация зависит от формата, зачем же тогда при копировании файлов выделяют собственный буфер, а считывание по одному байту (без собственного буфера) оборачивается очень медленной работой программы. Можете эксперимент провести, скопируйте файл в двоичном виде с буфером и без. Если бы двоичные потоки буферизовались, то такого бы не было.
1
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
11.11.2011, 14:11 14
Цитата Сообщение от Thinker Посмотреть сообщение
fcloseall();
А за эту функцию - спасибо! 20 лет программирую на Си, а про нее не знал
2
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:15 15
Цитата Сообщение от Байт Посмотреть сообщение
А за эту функцию - спасибо! 20 лет программирую на Си, а про нее не знал

Не по теме:

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

0
Байт
Эксперт C
18318 / 12029 / 2506
Регистрация: 24.12.2010
Сообщений: 24,293
11.11.2011, 14:18 16
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Thinker Посмотреть сообщение
Байт, setvbuf для текстового формата. Конечно fread быстрее считывает, там же "сырые" байты информации. Буферизация зависит от формата, зачем же тогда при копировании файлов выделяют собственный буфер, а считывание по одному байту (без собственного буфера) оборачивается очень медленной работой программы. Можете эксперимент провести, скопируйте файл в двоичном виде с буфером и без. Если бы двоичные потоки буферизовались, то такого бы не было.
Вот нашел
http://www.codenet.ru/progr/cpp/sprd/setvbuf.php
http://www.opennet.ru/man.shtml?topic=setvbuf&category=3&russian=0

ни слова о виде файла нету!
3
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:21 17
Цитата Сообщение от Байт Посмотреть сообщение
А примеры с fprintf не наводят на мысль и в каком формате файл открывают? Байт, поймите только правильно, это не спор, просто самому очень-очень интересно А как вам эта выдержка из вашей ссылки:

_IOLBF Выполняется строчная буферизация. Реально ввод/вывод выполняется, когда читается или записывается новая строка.
1
programina
2050 / 605 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 14:24  [ТС] 18
Thinker и Байт, спасибо вам большое. Я узнала про буферизацию потока.
0
Thinker
Эксперт С++
4233 / 2207 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 14:27 19
Цитата Сообщение от programina Посмотреть сообщение
Thinker и Байт, спасибо вам большое. Я узнала про буферизацию потока.

Не по теме:


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

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

_IONBF
(отключить буферизацию);
_IOLBF
(строчная буферизация);
_IOFBF
(блочная буферизация).
Мной тоже движет только жажда познания. Никаких отрицательных эмоций наша дискуссия у меня не вызывает.
2
11.11.2011, 14:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 14:29

Быстрое считывание 32кб из файла 7гб
Есть бинарный файл размером 6,95 ГБ, он представляет из себя массив short....

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

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