Вы можете сделать это довольно легко, если все, что вы хотите сделать, это сравнить начало каждой строки, а затем вести подсчет количества раз, когда ваше сравнение соответствует строке поиска. Подход состоит в том, чтобы прочитать каждую строку в фиксированный буфер достаточного размера с 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
, вы можете просто использовать цикл для получения длины поискового запроса и начального сравнения.