Как я могу пополнить буфер, когда данные в буфере проверяются в C? - PullRequest
1 голос
/ 13 июля 2020

В этом коде буфер длиной 1000 будет проверяться на наличие определенного слова. И следующая проверка начинается со 1001 позиции. Если поисковое слово находится на 998-й позиции или где-то еще, это слово будет проигнорировано. Я хотел бы знать, как мне пополнить буфер при проверке содержимого буфера. Как я могу сделать двойную буферизацию в этой проблеме, чтобы не использовать дополнительную память и программа работала быстрее?

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>

int main() {
    FILE *fptr;
    int l, count = 0, index;
    char name[100], word[25], buffer[1000], *pos;
    printf("\nEnter the word to be found:");
    scanf("%s", word);
    l = strlen(word);
    printf("\nEnter the file name:");
    scanf("%s", name);
    fptr = fopen(name, "r");
    if (fptr == NULL) {
        printf("\nProblem with opening the file");
        exit(1);
    }
    while ((fgets(buffer, 1000, fptr)) != NULL) {
        index = 0;
        while ((pos = strstr(buffer + index, word)) != NULL) {
            index = (pos - buffer) + 1;
            count++;
        }
    }
    printf("The word %s is found %d times", word, count);
    fclose(fptr);
}

1 Ответ

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

Ваша программа ищет все вхождения строки в файле, строка за строкой.

Например, строка aa присутствует 3 раза в строке aaaa. Это предполагаемое поведение?

Если в файле очень длинные строки, которые читаются по частям с помощью fgets(), вы все равно можете получить правильный счет, скопировав конец буфера в начало буфера и прочтите следующую часть после этого:

#include <stdio.h>
#include <string.h>

int main() {
    FILE *fptr;
    int len, count, index, overlap;
    char name[100], word[25], buffer[100];
    char *pos;

    printf("Enter the word to be found: ");
    if (scanf("%24s", word) != 1)
        return 1;
    len = strlen(word);
    printf("Enter the file name: ");
    if (scanf("%99s", name) != 1)
        return 1;
    fptr = fopen(name, "r");
    if (fptr == NULL) {
        printf("Problem with opening the file\n");
        return 1;
    }
    overlap = 0;
    count = 0;
    while (fgets(buffer + overlap, sizeof(buffer) - overlap, fptr) != NULL) {
        index = 0;
        while ((pos = strstr(buffer + index, word)) != NULL) {
            index = (pos - buffer) + 1;
            count++;
        }
        overlap = 0;
        if (strlen(buffer) == sizeof(buffer) - 1 && buffer[sizeof(buffer) - 2] != '\n') {
            // line was split
            memmove(buffer, buffer + sizeof(buffer) - len, len);
            overlap = len - 1;
        }
    }
    printf("The word %s is found %d times\n", word, count);
    fclose(fptr);
    return 0;
}
...