Другой вариант - передать имя файла и термины для поиска в качестве аргументов программы, а не жестко задавать имя файла и термины поиска.С вашими поисковыми терминами вы можете сравнить с тем же количеством начальных символов в каждой строке с strncmp
и вывести любые совпадающие строки (или сохранить их и т. Д.)
В то время как fgetc
будет читать одинсимвол за раз, fgets
(например, POSIX getline
) являются строковыми входными функциями и будут читать всю строку за раз (предоставьте буфер достаточного размера - don 't экономить на размере буфера )
Собирая все вместе, чтобы программа приняла имя файла для чтения в качестве первого аргумента, а затем любое количество поисковых терминов (до пределов argv
) в качестве последующихаргументы, вы можете сделать что-то похожее на:
#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 */
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 */
for (int i = 2; i < argc; i++) { /* loop over terms */
char *cmpstr = argv[i]; /* compare string */
size_t cmplen = strlen (cmpstr); /* length to compare */
if (strncmp (buf, cmpstr, cmplen) == 0) /* does start match? */
fputs (buf, stdout); /* output string */
}
}
fclose (fp); /* close file */
return 0;
}
Пример использования / Вывод
$ ./bin/cmpleadingstr2 /proc/cpuinfo "model name" "cpu cores"
model name : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores : 2
model name : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores : 2
model name : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores : 2
model name : Intel(R) Core(TM) i7-2620M CPU @ 2.70GHz
cpu cores : 2
или
$ ./bin/cmpleadingstr2 /proc/cpuinfo "processor"
processor : 0
processor : 1
processor : 2
processor : 3