Escanee un archivo para buscar palabras clave c predefinidas e imprímalas en la consola

¿Cómo puedo escanear un archivo en busca de una palabra y luego imprimir la línea que contiene esa palabra en la progtwigción en C?

Estoy tratando de encontrar una manera de escanear un archivo en busca de una palabra clave y luego imprimir solo la línea que contiene esa palabra. He tenido un comienzo muy duro. Esto es lo que tengo:

#include  void getDsk (void); void getDsk () { FILE* fp; char result [1000]; fp = popen("diskutil list","r"); fread(result,1,sizeof(result),fp); fclose (fp); while(!feof(fp)) { if(//line contains "Test".) { //show line. } } } int main(int argc, const char * argv[]) { getDsk(); return 0; } 

EDIT: Esto hizo lo que necesitaba.

 #include  void getDsk (void); void getDsk () { printf("Your available Windows installations are:\n"); FILE* fp = popen("diskutil list","r"); char line[1024]; while(fgets(line, sizeof(line), fp)) { if (strstr(line,"Microsoft")) { printf("%s", line); } // if line contains the text, print it } } int main(int argc, const char * argv[]) { getDsk(); return 0; } 

Unas pocas cosas:

1) Usted casi nunca debe escribir while(!feof(fp)) { ... } Es un patrón roto porque feof solo devolverá verdadero después de un bash de lectura. Así que estás abierto a un error por uno.

2) ¿Por qué diablos estás haciendo esto?

 fp = popen("diskutil list","r"); fread(result,1,sizeof(result),fp); fclose (fp); 

Usted está leyendo 1000 caracteres del archivo y luego lo está cerrando ; luego, su código auxiliar actúa como si planea leer el archivo un poco más … no tiene sentido.

3) Aquí hay un enfoque razonable:

 char line[1024]; while(fgets(line, sizeof(line), fp)) { // if line contains the text, print it } 

lo que está sucediendo aquí es que fgets leerá una línea y devolverá NULL si tiene éxito. ( NULL se trata como “falso”, no NULL es “verdadero” cuando se usa en una prueba).

Así que está diciendo “mientras podamos leer una línea con éxito, haga lo siguiente”, que es realmente lo que quiere. Además, estoy asumiendo que ninguna línea excederá los 1024 caracteres, lo que generalmente es una suposición razonable, si este no es el caso, entonces tendrá que hacer los ajustes correspondientes.

En su código actual, parece que está leyendo todo el archivo de una vez para ver el result , por lo que no hay un concepto de “línea”.

Recomiendo cambiar su bucle para que lea el archivo una línea a la vez.
Investigar fgets
En cada línea, compruebe esa línea para la palabra clave ( strstr ).

 while(fgets(line, sizeof(line), fp)) { if (strstr(line, keyword) != NULL) { puts(line); // if line contains the text, print it } }