Здравствуйте, RussianFellow, Вы писали:
RF>Функции fscanf, fgets, fprintf для этого подходят или же лучше использовать какие-нибудь другие способы? Есть ли в библиотеке MFC такие способы?
Функции типа fscanf и fgets вообще мало для чего подходят, кроме наколенных поделок. Что будет делать твоя программа, если в текстовом файле "случайно" оказалась строка длинной 4 килобайта? Какого размера должен быть буфер для fgets'а, чтобы считать, что любой не "битый" файл прочтется корректно? Какая максимально допустимая длинна строки в корректном "текстовом" файле, и как должна вести себя программа, если этот лимит превышен?
Функции типа fread в сочетании с ручным разделением на строки могут работать очень даже неплохо, но это зависит от реализации. В одних реализациях они автоматически используют memory mapped файлы, в других существенного ускорения можно добиться, поставив большой буфер (см. setvbuf) или просто читая в большой буфер.
fprintf — это функция форматного вывода, и если тебе нужен именно он, без нее трудно обойтись. Но если тебе не нужен форматный вывод, лучше использовать fwrite, fputs на худой конец. С достаточно большим буфером она может работать неплохо.
RF>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).
За какое время его надо прочитать? Не исключено, что на современном железе он читается достаточно быстро, даже если все делать максимально по-простому.
Re[2]: Быстрое чтение из файла и быстрая запись в файл
Здравствуйте, Pzz, Вы писали:
RF>>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).
Pzz>За какое время его надо прочитать? Не исключено, что на современном железе он читается достаточно быстро, даже если все делать максимально по-простому.
За несколько секунд (например, за 5 секунд, максимум--за 10 секунд).
1613 г. = 2024 г.
Re[3]: Быстрое чтение из файла и быстрая запись в файл
Здравствуйте, RussianFellow, Вы писали:
Pzz>>За какое время его надо прочитать? Не исключено, что на современном железе он читается достаточно быстро, даже если все делать максимально по-простому.
RF>За несколько секунд (например, за 5 секунд, максимум--за 10 секунд).
Я бы попробовал, но мне кажется, это очень большое время, и код, написанный без каких-либо ухищрений, будет легко в это время укладываться.
Re[2]: Быстрое чтение из файла и быстрая запись в файл
И ещё вопрос: для считывания данных из строки существует функция sscanf.
Существуют ли ещё какие-нибудь функции считывания данных из строк, и если да, то какие?
1613 г. = 2024 г.
Re[3]: Быстрое чтение из файла и быстрая запись в файл
Здравствуйте, RussianFellow, Вы писали:
RF>И ещё вопрос: для считывания данных из строки существует функция sscanf. RF>Существуют ли ещё какие-нибудь функции считывания данных из строк, и если да, то какие?
Не понял вопроса. Что значит, считывание данных из строк, и чем оно отличается от считывания данных из строки?
Re[4]: Быстрое чтение из файла и быстрая запись в файл
Здравствуйте, Pzz, Вы писали:
Pzz>Здравствуйте, RussianFellow, Вы писали:
RF>>И ещё вопрос: для считывания данных из строки существует функция sscanf. RF>>Существуют ли ещё какие-нибудь функции считывания данных из строк, и если да, то какие?
Pzz>Не понял вопроса. Что значит, считывание данных из строк, и чем оно отличается от считывания данных из строки?
Ну то есть имеется длинная строка, содержащая слова или числа, разделённые пробелами. Также в этой строки имеются символы '\n'. Завершается эта строка символом '\0'.
Как сосчитать эти слова и числа из этой строки? Только ли при помощи функции sscanf или же можно как-то по-другому?
1613 г. = 2024 г.
Re[5]: Быстрое чтение из файла и быстрая запись в файл
Здравствуйте, RussianFellow, Вы писали:
RF>Ну то есть имеется длинная строка, содержащая слова или числа, разделённые пробелами. Также в этой строки имеются символы '\n'. Завершается эта строка символом '\0'. RF>Как сосчитать эти слова и числа из этой строки? Только ли при помощи функции sscanf или же можно как-то по-другому?
Ну, sscanf'у все равно, есть там символы конца строк, или нет. В том смысле, что он считает их пробельными.
Но я бы все же написал парсер. Хотя бы уже для того, чтобы получить внятную диагностику при ошибках.
Re: Быстрое чтение из файла и быстрая запись в файл
Здравствуйте, RussianFellow, Вы писали:
RF>Интересно, какие существуют способы быстрого чтения строк из текстового файла и быстрой записи строк в текстовой файл?
RF>Функции fscanf, fgets, fprintf для этого подходят или же лучше использовать какие-нибудь другие способы? Есть ли в библиотеке MFC такие способы?
RF>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).
Самый быстрый способ в винде это API функции ReadFile()/WriteFile() c размером буфера 16/32/64 кб...
Re: Быстрое чтение из файла и быстрая запись в файл
Здравствуйте, RussianFellow, Вы писали:
RF>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).
Вам тут чего-то мозги пудрят. Насколько я знаю, под fprintf, fscanf может лежать самый обыкновенный буфер из байт, в который например за один вызов читается разом 2 МБ байт из файла, а все последующие вызовы будут обращаться уже к этому буферу. Сделайте всё абстрагировано, создайте некий класс, который будет вам читать очередную строку одним методом, разбирать её другим методом, внутрь вставьте scanf'ы и померьте скорость, будет медленно — замените реализацию.
Вы ниже спрашиваете, как строку разобрать — ну тут уж... можно scanf, можно через split, можно через регулярные выражения. Я надеюсь, вам там не придётся писать полноценный парсер.
Re: Быстрое чтение из файла и быстрая запись в файл
Здравствуйте, RussianFellow, Вы писали:
RF>Интересно, какие существуют способы быстрого чтения строк из текстового файла и быстрой записи строк в текстовой файл?
RF>Функции fscanf, fgets, fprintf для этого подходят или же лучше использовать какие-нибудь другие способы? Есть ли в библиотеке MFC такие способы?
RF>(Речь идёт о случае, когда надо сосчитать из файла 50 тысяч строк или записать в файл 50 тысяч строк).