Как в C считывать не одну строку, а весь текст?

Изучая Си, захотелось закрепить материал простенькой консольной программой, которая проверяет наличие какой-то строки в указанном тексте и выводит в консоль нашел ли он совпадение или нет. Код:

#include <stdio.h>
    #include <string.h>
    int main(int argc, char *argv[])
    {
        if(argc != 3)
        {
            fprintf(stderr, "You must send 2 arguments!");
            return 1;
        }
        FILE *in = fopen(argv[2], "r"); // input
        char text[80];
        fscanf(in, "%79[^\n]\n", text);
    
        if(strstr(text,argv[1]))
        {
            printf("I found this in the text!");
        }
        else
        {
            printf("I didn't find this in the text");
        }
        return 0;
    } 

В итоге, программа работает, считывая лишь первую строку в тексте. Как считывать весь текст?


Ответы (2 шт):

Автор решения: Harry

Например, так:

#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[])
{
    if(argc != 3)
    {
        fprintf(stderr, "You must send 2 arguments!");
        return 1;
    }
    FILE *in = fopen(argv[2], "r"); // input
    char text[80];
    while(fscanf(in, "%79[^\n]\n", text) != EOF)
    {
        if(strstr(text,argv[1]))
        {
            printf("I found this in the text!");
            fclose(in);
            return 0;
        }
    }
    printf("I didn't find this in the text");
    fclose(in);
}
→ Ссылка
Автор решения: Centrix

Для этого вы можете считать все символы пока не достигнете EOF. Чтобы определить достигнут ли конец файла можно использовать функцию feof, которая берёт на вход поток. Для считывания символа можно использовать fgetc,которая так же берёт в качестве аргумента поток. В итоге мы получим такой код считывания содержимого всего файла:

#define LEN 512 // размер буфера, в который считываем текст файла

char *read_file(char *name) {
    FILE *fptr = fopen(name, "r"); // открываем сам файл
    static char buffer[LEN] = ""; // буфер будет статическим
    int c = 0, i = 0; // c - очередной символ из файла, i - счётчик

    c = fgetc(fptr); // читаем первый символ
    while (!feof(fptr) && i < LEN) { // пока не достигнем конца файла или буфера
        buffer[i++] = c; // записывам символ в буфер
        c = fgetc(fptr); // читаем следующий символ
    }
    fclose(fptr); // закрываем файл
    buffer[i] = '\0'; // ставим завершающий символ

    return buffer; // ну и возвращаем ваш буфер как результат
}

Далее вы просто вызываете эту функцию и ищете в буфере текст. Но! У этого способа есть одна проблема, если файл содержит больше символов, чем может хранить буфер, то всё что не влезло будет отсечено. Что бы решить эту проблему можно сначала посчитать сколько символов в файле, а потом при помощи например malloc выделить нужный буфер.

→ Ссылка