Можно ли точно посчитать частоту слова в файле, используя два буфера в C? - PullRequest
2 голосов
/ 14 июля 2020

У меня есть файл размером 1ГБ. Я хочу узнать, сколько раз слово «sosowhat» встречается в файле. Я написал код с использованием fget c (), который читает по одному символу из файла за раз, что намного медленнее, если речь идет о файле размером 1 ГБ. Поэтому я сделал буфер размером 1000 (используя mmallo c) для хранения 1000 слов из файла за раз, и я использовал функцию strstr () для подсчета появления слова «sosowhat». Логи c в порядке. Но проблема в том, что если часть «so» слова «sosowhat» находится в конце буфера, а часть «sowhat» - в новом буфере, слово не будет учитываться. Итак, я использовал два буфера: old_buffer и current_buffer. В начале каждого буфера я хочу проверить последние несколько символов старого буфера. Это возможно? Как мне go вернуться к старому буферу? Возможно ли это без memmove ()? Будучи новичком, буду более чем рад вашей помощи.

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

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

0 голосов
/ 14 июля 2020

Да, это возможно. Есть и другие возможные подходы к этому.

Первый, самый чистый, состоит в том, чтобы сохранить второй буфер, как предлагается, длины искомого слова, где вы сохраняете последний кусок старого буфер. (Это должно быть точно по длине искомого слова, потому что вы храните wordLength - 1 символов + NULL терминатор). Тогда самый быстрый способ - добавить к этому сохраненному фрагменту из старого буфера первые wordLen - 1 символов из нового буфера и искать здесь свое слово. Затем продолжите поиск в обычном режиме. - Конечно, вы можете создать буфер, который может содержать оба фрагмента (последние байты из старого буфера и первые байты из нового).

Другой подход (который я не рекомендую, но можно включить быть немного проще с точки зрения кода) будет на fseek wordLen - 1 байтов назад в прочитанном файле. Это «переместит» фрагмент, сохраненный в предыдущем подходе, в следующий буфер. Это немного грязнее, так как вы дважды прочитаете часть содержимого файла. Хотя это не является чем-то заметным с точки зрения производительности, я снова не рекомендую этого и использовать что-то вроде первого описанного подхода.

...