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

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

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

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

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

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 12:44     Быстрое чтение файла #2
Можно создать в памяти свой буфер и из файла (двоичного) данные считывать целыми кусками, если не весь файл целиком.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:33  [ТС]     Быстрое чтение файла #3
Если я правильно поняла, то ты предлагаешь предварительно загрузить данные из файла в массив, а потом получать данные из массива.
Thinker
Эксперт C++
4221 / 2195 / 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
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 13:35     Быстрое чтение файла #5
Thinker, извините, что перебиваю вашу беседу... А разве потоки ввода-вывода C++ (и Си, кстати, тоже интересно) не буферизируют ввод, предварительно считывая кусок информации определённого размера из файла?
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:37     Быстрое чтение файла #6
Цитата Сообщение от talis Посмотреть сообщение
Thinker, извините, что перебиваю вашу беседу... А разве потоки ввода-вывода C++ (и Си, кстати, тоже интересно) не буферизируют ввод, предварительно считывая кусок информации определённого размера из файла?
Только символьные (текстовый формат) потоки автоматически буферизованы, а двоичные надо самим буферизовать
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:43  [ТС]     Быстрое чтение файла #7
Спасибо за ответы, но меня больше интересует, что будет быстрее fread, fscanf или что-нибудь еще есть чего я не знаю
Thinker
Эксперт C++
4221 / 2195 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:45     Быстрое чтение файла #8
Цитата Сообщение от programina Посмотреть сообщение
Спасибо за ответы, но меня больше интересует, что будет быстрее fread, fscanf или что-нибудь еще есть чего я не знаю
fread для работы в двоичном формате, fscanf - в текстовом. Смотря как у вас информация хранится.
programina
1914 / 599 / 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++
4221 / 2195 / 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
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 14:02  [ТС]     Быстрое чтение файла #11
Thinker, спасибо вам большое.
Я в своей программе сделала чтение из файла с помощью fscanf. Файл пока текстовый, но я планировала использовать бинарные файлы. Поэтому перепишу свою прогу с fread.
Байт
Эксперт C
15636 / 9978 / 1499
Регистрация: 24.12.2010
Сообщений: 18,742
11.11.2011, 14:02     Быстрое чтение файла #12
Цитата Сообщение от Thinker Посмотреть сообщение
Только символьные (текстовый формат) потоки автоматически буферизованы, а двоичные надо самим буферизовать
ИМХО, буферизация не зависит от вида (текстовой/байтовый) файла. Если я ошибаюсь, дайте ссылочку. В старинном, но очень хорошем справочнике по С
написано, что не буферизуются stdin, stdoun, если буфер специально не назначен.
и еще есть функция setvbuf устанавливающая размер буфера

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

Не по теме:

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

Байт
Эксперт C
15636 / 9978 / 1499
Регистрация: 24.12.2010
Сообщений: 18,742
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++
4221 / 2195 / 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++
4221 / 2195 / 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++
Собственно, вопрос в теме. Как быстро выделить память под файл? Можно, конечно, методично записать в файл массив необходимого размера, но...

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

Чтение из файла - C++
Подскажите как вывести на экран содержимое файла на Си, если данные разделены ";". Файл имеет вид: 1;23233233;1234-43;иванов...

Чтение из файла - C++
Привет, народ, объясните, пожалуйста, в чем дело: #include <iostream> #include <fstream> using namespace std; int main(void) ...

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


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

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

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

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