Быстрое чтение из файла и быстрая запись в файл
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 25.01.18 12:02
Оценка:
Интересно, какие существуют способы быстрого чтения строк из текстового файла и быстрой записи строк в текстовой файл?

Функции fscanf, fgets, fprintf для этого подходят или же лучше использовать какие-нибудь другие способы? Есть ли в библиотеке MFC такие способы?

(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).
1613 г. = 2024 г.
Re: Быстрое чтение из файла и быстрая запись в файл
От: Amon_RA Россия  
Дата: 25.01.18 12:04
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

memory-mapped files

Дальше сам.
Re: Быстрое чтение из файла и быстрая запись в файл
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.01.18 13:33
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Функции fscanf, fgets, fprintf для этого подходят или же лучше использовать какие-нибудь другие способы? Есть ли в библиотеке MFC такие способы?


Функции типа fscanf и fgets вообще мало для чего подходят, кроме наколенных поделок. Что будет делать твоя программа, если в текстовом файле "случайно" оказалась строка длинной 4 килобайта? Какого размера должен быть буфер для fgets'а, чтобы считать, что любой не "битый" файл прочтется корректно? Какая максимально допустимая длинна строки в корректном "текстовом" файле, и как должна вести себя программа, если этот лимит превышен?

Функции типа fread в сочетании с ручным разделением на строки могут работать очень даже неплохо, но это зависит от реализации. В одних реализациях они автоматически используют memory mapped файлы, в других существенного ускорения можно добиться, поставив большой буфер (см. setvbuf) или просто читая в большой буфер.

fprintf — это функция форматного вывода, и если тебе нужен именно он, без нее трудно обойтись. Но если тебе не нужен форматный вывод, лучше использовать fwrite, fputs на худой конец. С достаточно большим буфером она может работать неплохо.

RF>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).


За какое время его надо прочитать? Не исключено, что на современном железе он читается достаточно быстро, даже если все делать максимально по-простому.
Re[2]: Быстрое чтение из файла и быстрая запись в файл
От: AlexGin Беларусь  
Дата: 25.01.18 13:39
Оценка:
Здравствуйте, Amon_RA, Вы писали:

A_R>Здравствуйте, RussianFellow, Вы писали:

A_R>memory-mapped files
A_R>Дальше сам.

Брошу ещё подсказку (фактически синоним того, о чём указано выше) — Shared Memory
Re[2]: Быстрое чтение из файла и быстрая запись в файл
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 25.01.18 14:15
Оценка:
Здравствуйте, Pzz, Вы писали:

RF>>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).


Pzz>За какое время его надо прочитать? Не исключено, что на современном железе он читается достаточно быстро, даже если все делать максимально по-простому.


За несколько секунд (например, за 5 секунд, максимум--за 10 секунд).
1613 г. = 2024 г.
Re[3]: Быстрое чтение из файла и быстрая запись в файл
От: Pzz Россия https://github.com/alexpevzner
Дата: 25.01.18 14:27
Оценка: +1
Здравствуйте, RussianFellow, Вы писали:

Pzz>>За какое время его надо прочитать? Не исключено, что на современном железе он читается достаточно быстро, даже если все делать максимально по-простому.


RF>За несколько секунд (например, за 5 секунд, максимум--за 10 секунд).


Я бы попробовал, но мне кажется, это очень большое время, и код, написанный без каких-либо ухищрений, будет легко в это время укладываться.
Re[2]: Быстрое чтение из файла и быстрая запись в файл
От: Evgeniy Skvortsov Россия  
Дата: 25.01.18 14:39
Оценка:
Здравствуйте, Amon_RA, Вы писали:

A_R>memory-mapped files


Тут где-то валялся класс-обертка для работы с MMF.

А вот https://rsdn.org/article/files/Classes/filemap.xml
Автор(ы): Виталий Брусенцев
Дата: 12.11.2001

Класс CFileMap упрощает работу с файлами, проецируемыми в память
(memory-mapped files).
Re[2]: Быстрое чтение из файла и быстрая запись в файл
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 31.01.18 13:54
Оценка:
И ещё вопрос: для считывания данных из строки существует функция sscanf.
Существуют ли ещё какие-нибудь функции считывания данных из строк, и если да, то какие?
1613 г. = 2024 г.
Re[3]: Быстрое чтение из файла и быстрая запись в файл
От: Pzz Россия https://github.com/alexpevzner
Дата: 31.01.18 13:56
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>И ещё вопрос: для считывания данных из строки существует функция sscanf.

RF>Существуют ли ещё какие-нибудь функции считывания данных из строк, и если да, то какие?

Не понял вопроса. Что значит, считывание данных из строк, и чем оно отличается от считывания данных из строки?
Re[4]: Быстрое чтение из файла и быстрая запись в файл
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 31.01.18 14:14
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, RussianFellow, Вы писали:


RF>>И ещё вопрос: для считывания данных из строки существует функция sscanf.

RF>>Существуют ли ещё какие-нибудь функции считывания данных из строк, и если да, то какие?

Pzz>Не понял вопроса. Что значит, считывание данных из строк, и чем оно отличается от считывания данных из строки?


Ну то есть имеется длинная строка, содержащая слова или числа, разделённые пробелами. Также в этой строки имеются символы '\n'. Завершается эта строка символом '\0'.
Как сосчитать эти слова и числа из этой строки? Только ли при помощи функции sscanf или же можно как-то по-другому?
1613 г. = 2024 г.
Re[5]: Быстрое чтение из файла и быстрая запись в файл
От: Pzz Россия https://github.com/alexpevzner
Дата: 31.01.18 14:26
Оценка: +2
Здравствуйте, RussianFellow, Вы писали:

RF>Ну то есть имеется длинная строка, содержащая слова или числа, разделённые пробелами. Также в этой строки имеются символы '\n'. Завершается эта строка символом '\0'.

RF>Как сосчитать эти слова и числа из этой строки? Только ли при помощи функции sscanf или же можно как-то по-другому?

Ну, sscanf'у все равно, есть там символы конца строк, или нет. В том смысле, что он считает их пробельными.

Но я бы все же написал парсер. Хотя бы уже для того, чтобы получить внятную диагностику при ошибках.
Re: Быстрое чтение из файла и быстрая запись в файл
От: .alex Ниоткуда  
Дата: 11.07.18 07:26
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Интересно, какие существуют способы быстрого чтения строк из текстового файла и быстрой записи строк в текстовой файл?


RF>Функции fscanf, fgets, fprintf для этого подходят или же лучше использовать какие-нибудь другие способы? Есть ли в библиотеке MFC такие способы?


RF>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).

Самый быстрый способ в винде это API функции ReadFile()/WriteFile() c размером буфера 16/32/64 кб...
Re: Быстрое чтение из файла и быстрая запись в файл
От: Слава  
Дата: 11.07.18 07:34
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).


Вам тут чего-то мозги пудрят. Насколько я знаю, под fprintf, fscanf может лежать самый обыкновенный буфер из байт, в который например за один вызов читается разом 2 МБ байт из файла, а все последующие вызовы будут обращаться уже к этому буферу. Сделайте всё абстрагировано, создайте некий класс, который будет вам читать очередную строку одним методом, разбирать её другим методом, внутрь вставьте scanf'ы и померьте скорость, будет медленно — замените реализацию.

Вы ниже спрашиваете, как строку разобрать — ну тут уж... можно scanf, можно через split, можно через регулярные выражения. Я надеюсь, вам там не придётся писать полноценный парсер.
Re: Быстрое чтение из файла и быстрая запись в файл
От: YF Германия  
Дата: 31.07.18 11:52
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Интересно, какие существуют способы быстрого чтения строк из текстового файла и быстрой записи строк в текстовой файл?


RF>Функции fscanf, fgets, fprintf для этого подходят или же лучше использовать какие-нибудь другие способы? Есть ли в библиотеке MFC такие способы?


RF>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).


CStdioFile?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.