C как искать строку в файле? - PullRequest
0 голосов
/ 21 ноября 2018

У меня проблема с моим кодом, я пытаюсь найти строку в файле, и я могу прочитать ее, но, когда я сравниваю две строки, он принимает только последнюю из файла, равную первой строкевведено с scanf().

Итак, представьте, что я написал в своем файле три слова, и каждое возвращается на строку.

test
test12
test123

Если в моем scanf() я пишу test12 Например, или test, когда он будет читать, он вернет false для сравнения, поэтому (! == 0).Но если я напишу test123, это сработает, потому что это последнее слово в файле, но я не знаю почему?

char word[26];
char singleLine[26];
FILE *file = fopen("bin/Release/myWords.txt", "a+");

scanf("%26s", word);

if (file != NULL) {
    while (!feof(file)) {
        fgets(singleLine, 26, file);

        compare = strcmp(singleLine, word);
        if (compare == 0) {
            printf("\n%s\n",word);
        }
    }
    fclose(file);
}

1 Ответ

0 голосов
/ 21 ноября 2018

Ваша программа работает только в очень особых случаях и имеет несколько проблем:

  • scanf("%26s", word); может повлиять на до 27 байтов в массиве назначения, который определен с длиной только 26.
  • Более того, вы должны проверить возвращаемое значение, чтобы избежать неопределенного поведения при неверном вводе.
  • fopen("bin/Release/myWords.txt", "a+"); открывает файл в режиме добавления: это необходимо?
  • while (!feof(file)) всегда неверно, вы должны вместо этого проверить возвращаемое значение fgets(), которое возвращает NULL в конце файла.
  • compare = strcmp(singleLine, word); сравнивает только точную математику полной строки, которая может толькопроизойдет, если слово содержит 25 символов, в противном случае завершающий символ новой строки в singleLine приведет к сбою сравнения.Кроме того, прерывистые строки могут привести к неожиданным результатам, а также к тому, что файл не заканчивается новой строкой.
  • причина, по которой он соответствует последнему слову в файле, заключается в том, что вы забыли написать завершающий символ новой строки после последнего словав файле, поэтому последний fgets() заполняет буфер точным словом и без завершающей строки.
  • если вы ищете совпадения внутри строки, вы должны использовать больший буфер и искать совпадение с помощью strstr.
  • если вы ищете точное совпадение, перед сравнением следует убрать завершающий символ новой строки.

Вот модифицированная версия:

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

int main() {
    char word[27];
    char singleLine[256];
    FILE *file = fopen("bin/Release/myWords.txt", "r");

    if (scanf("%26s", word) != 1)
        return 1;

    if (file != NULL) {
        while (fgets(singleLine, sizeof singleLine, file)) {
            singleLine[strcspn(singleLine, "\n")] = '\0'; // strip the newline if any
            compare = strcmp(singleLine, word);
            if (compare == 0) {
                printf("\n%s\n", word);
            }
        }
        fclose(file);
    }
    return 0;
}
...