Как напечатать на выходе только строку обнаруженной строки в файле - PullRequest
0 голосов
/ 11 мая 2019

Давайте предположим, что у меня есть файл, содержащий информацию в каждой строке. В этом формате: Название информации: Информация. В этом файле много информации. Мне удалось получить название информации в моем коде, используя "strstr". Но проблема в том, когда я печатаю. Выводится до EOF (Конец файла), а не до конца строки (\ n). Вопрос в том, как я могу получить завершенную строку, когда найду строку. Что делать, если строка найдена много раз? Спасибо

char* p; // Pointer
content=charge_file("cpuinfo.txt"); // This function charge the cpu informations in a file called cpuinfo.txt
    p=strstr(content,"processor"); // I'm looking for the String "processor"

       while(p!=NULL){ // While not end of file
       p++;
       if(p=strstr(p,"processor")){
       count++; // New processor found
        }
      printf("%d",count);// number of processors  
       }```

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Вы можете сделать это довольно легко, если все, что вы хотите сделать, это сравнить начало каждой строки, а затем вести подсчет количества раз, когда ваше сравнение соответствует строке поиска. Подход состоит в том, чтобы прочитать каждую строку в фиксированный буфер достаточного размера с fgets(), а затем сделать простое сравнение начала строки с вашей строкой поиска с помощью strncmp. Если сравнение дает истину, увеличьте счетчик.

Например, вы можете сделать что-то похожее на следующее, где имя файла для чтения предоставляется первым аргументом программы, а термин для поиска в начале каждой строки предоставляется как второй аргумент:

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

#define MAXC 2048   /* if you need a constant, #define one (or more) */

int main (int argc, char **argv) {

    char buf[MAXC]; /* buffer to hold each line in file */ 
    char *cmpstr = argc > 2 ? argv[2] : "processor";    /* compare string */
    size_t cmplen = strlen (cmpstr), nstr = 0;  /* length to compare, count */
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : NULL;  /* open file */

    if (!fp) {  /* validate file open for reading */
        perror ("file open failed");
        return 1;
    }

    while (fgets (buf, MAXC, fp))                   /* read each line */
        if (strncmp (buf, cmpstr, cmplen) == 0)     /* does start match? */
            nstr++;     /* increment count */
    fclose (fp);                                    /* close file */

    printf ("%zu - %s(s)\n", nstr, cmpstr);         /* output results */

    return 0;
}

( примечание: не экономьте на размере буфера. Вы бы предпочли иметь 100 000 символов слишком много, чем 1 символ слишком мало)

Пример использования / Вывод

Чтение /proc/cpuinfo непосредственно вы бы сделали:

$ ./bin/cmpleadingstr /proc/cpuinfo processor
4 - processor(s)

Если вы хотите дополнительно вывести каждую из подходящих строк, просто включите вызов fputs для соответствующей строки, например,

    while (fgets (buf, MAXC, fp))                   /* read each line */
        if (strncmp (buf, cmpstr, cmplen) == 0) {   /* does start match? */
            fputs (buf, stdout);                    /* output string */
            nstr++;     /* increment count */
        }

Вывод с напечатанной строкой

$ ./bin/cmpleadingstr /proc/cpuinfo processor
processor       : 0
processor       : 1
processor       : 2
processor       : 3

4 - processor(s)

( примечание: перевод строки до общего количества добавлено)

Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы. Если по какой-либо причине вы не можете использовать библиотеку string.h, вы можете просто использовать цикл для получения длины поискового запроса и начального сравнения.

0 голосов
/ 11 мая 2019

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

надеюсь, что я достаточно ясно ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...