С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

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

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

Не по теме:

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

0
11.11.2011, 14:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.11.2011, 14:15
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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