Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/104: Рейтинг темы: голосов - 104, средняя оценка - 4.97
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2

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

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

Студворк — интернет-сервис помощи студентам
Здраствуйте. Я пишу программу, которая читает файлы порядка от нескольких килобайтов до максимум 3 Мб. Посоветуйте пожалуйста, какие функции и/или алгоритмы использовать для максимальнобыстрого чтения данных, представленных вещественными числами. Прошу прощения, если мой вопрос неправильно сформулирован.
3
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.11.2011, 10:59
Ответы с готовыми решениями:

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

Быстрое чтение и запись файлов
Вопрос такой: имеется файл 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...

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

71
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 12:44
Можно создать в памяти свой буфер и из файла (двоичного) данные считывать целыми кусками, если не весь файл целиком.
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:33  [ТС]
Если я правильно поняла, то ты предлагаешь предварительно загрузить данные из файла в массив, а потом получать данные из массива.
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:35
Цитата Сообщение от 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
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 13:35
Thinker, извините, что перебиваю вашу беседу... А разве потоки ввода-вывода C++ (и Си, кстати, тоже интересно) не буферизируют ввод, предварительно считывая кусок информации определённого размера из файла?
1
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:37
Цитата Сообщение от talis Посмотреть сообщение
Thinker, извините, что перебиваю вашу беседу... А разве потоки ввода-вывода C++ (и Си, кстати, тоже интересно) не буферизируют ввод, предварительно считывая кусок информации определённого размера из файла?
Только символьные (текстовый формат) потоки автоматически буферизованы, а двоичные надо самим буферизовать
3
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:43  [ТС]
Спасибо за ответы, но меня больше интересует, что будет быстрее fread, fscanf или что-нибудь еще есть чего я не знаю
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:45
Цитата Сообщение от programina Посмотреть сообщение
Спасибо за ответы, но меня больше интересует, что будет быстрее fread, fscanf или что-нибудь еще есть чего я не знаю
fread для работы в двоичном формате, fscanf - в текстовом. Смотря как у вас информация хранится.
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 13:49  [ТС]
А если я открою файл таким образом:
C++
1
FILE* fo = fopen("test.txt","rb");
я потом не смогу из него прочитать число c помощью fscanf, простите если вопрос тупой
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.11.2011, 13:53
Цитата Сообщение от programina Посмотреть сообщение
А если я открою файл таким образом:
C++
1
FILE* fo = fopen("test.txt","rb");
я потом не смогу из него прочитать число, простите если вопрос тупой

Не по теме:


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


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

C++
1
FILE* fo = fopen("test.txt","r");
и используйте fscanf
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
11.11.2011, 14:02  [ТС]
Thinker, спасибо вам большое.
Я в своей программе сделала чтение из файла с помощью fscanf. Файл пока текстовый, но я планировала использовать бинарные файлы. Поэтому перепишу свою прогу с fread.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.11.2011, 14:02
Цитата Сообщение от Thinker Посмотреть сообщение
Только символьные (текстовый формат) потоки автоматически буферизованы, а двоичные надо самим буферизовать
ИМХО, буферизация не зависит от вида (текстовой/байтовый) файла. Если я ошибаюсь, дайте ссылочку. В старинном, но очень хорошем справочнике по С
написано, что не буферизуются stdin, stdoun, если буфер специально не назначен.
и еще есть функция setvbuf устанавливающая размер буфера

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

Не по теме:

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

0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.11.2011, 14:18
Лучший ответ Сообщение было отмечено как решение

Решение

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

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

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

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

Не по теме:


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

1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
11.11.2011, 14:29
Цитата Сообщение от Thinker Посмотреть сообщение
_IOLBF Выполняется строчная буферизация. Реально ввод/вывод выполняется, когда читается или записывается новая строка.
Функция setvbuf может быть использована над любым открытым потоком для изменения типа буферизации. Параметр mode должен быть одним из трех следующих макросов:

_IONBF
(отключить буферизацию);
_IOLBF
(строчная буферизация);
_IOFBF
(блочная буферизация).
Мной тоже движет только жажда познания. Никаких отрицательных эмоций наша дискуссия у меня не вызывает.
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2011, 14:29
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru