Cómo leer datos de un tipo de entrada desconocido (filestream o stdin) C

Quería saber cómo leer datos de una fuente de entrada desconocida, lo que significa que no sé si el usuario solo va a escribir una oración o si me va a dar un archivo de texto. He intentado usar fscanf desde que lo leí. Está diseñado para un tipo de entrada sin formato. Este es mi código. Supongo que debo obtener algún tipo de entrada (archivo o simplemente una oración (echo bla bla bla) e "int" e imprimir solo las primeras palabras "int" . El progtwig debe usarse para canalizar, lo que significa que el comando se vería así:
Hay 2 maneras de usar el progtwig:

 1.echo "blabla" | myprog 2 (number of words to print) 2.cat input.txt | myprog 2 (number of words to print) 

La línea problemática es la línea 16, intenté usar fscanf
¡Gracias!

  1 #include  2 #include  3 #include  4 #include  5 6 7 int main(int argc, char *argv[]){ 8 char *words[32]; 9 int numofwords = atoi(argv[2]); 10 int i=0; 11 int len; 12 char *word = malloc (32 * sizeof(char)); 13 char c; 14 while (i<=numofwords){ 15 if ((c = getc (argv[1])) != EOF){ 16 fscanf(argv[1],"%s",&word); 17 len = strlen (word); 18 words[i] = malloc ((len+1) * sizeof(char)); 19 i++ 20 } 21 printf(words[i]); 22 } 23 return 0; 24 } 25 

Puede ser que entiendo correctamente su necesidad.

No estoy rectificando tu código sino escribiendo el mío.

A continuación se muestra el código simple que se lee desde la consola: código: main.c

 #include  #include  #include  #include  int main(int argc, char* argv[]){ if(argc!=2){ printf("\n wrong number of argument\n"); exit(1); } int numofwords = atoi(argv[1]); char buffer[128]; //printf("%d\n",numofwords); while(numofwords--){ scanf("%s",buffer); printf("%s\n",buffer); } return 0; } 

Cómo funciona:

 ~$ gcc main.c -o main 

ejecutar:

 :~$ ./main wrong number of argument :~$ ./main 2 grijesh grijesh yourname yourname :~$ 

Espero que te haya entendido. el progtwig simplemente lee (escanea) desde la consola e imprime en la consola. El bucle while se ejecuta durante la cantidad de tiempo que pasa en la entrada de línea de comando.

Ahora, un archivo de texto dumy.txt un archivo de entrada:

 :~$ cat dumy.txt yourname myname hisname hername :~$ 

Ahora ve lo que quieres lograr a través de tu código:

 :~$ cat dumy.txt | ./main 2 yourname myname :~$ 

Si quieres pasar por echo :

 :~$ echo $'one\ntwo\nthree' | ./main 2 one two :~$ 

¿Esto es lo que quieres?

En caso afirmativo:

Lo que extrañas entendiste que:

[tu codigo]

( error 1,2 )
Su fsacnf está equivocado de dos maneras:

 fscanf(argv[1],"%s",&word); 
  • El primer argumento es argv[1] es char* que es incorrecto, debe pasar el tipo FILE* . Como se explica en la respuesta del Sr. Oli Charlesworth.

  • En segundo lugar, todavía necesita leer desde la stdin . | el operador redirige la salida del primer comando al segundo comando.

( error 3, 4, 5, 6 )
Al enviar echo "blabla" solo está enviando una única picadura que necesita para hacer algo como lo hice ( agregué \ n en la cadena de eco para la nueva línea, también mi cadena de eco comienza con $ para que no se imprima como cadena sin formato ). echo para que puedas leer desde el código de acuerdo con el segundo argumento que es argv[1] no argv[2] . Así que en su código la siguiente línea es incorrecta también.

 int numofwords = atoi(argv[2]); 

Corrigí esta línea en mi código.

y i se inicializa a cero i = 0 , en tanto que la condición del bucle es <= , creo que debería ser < .

( error 7 )
La forma en que ejecuta su código es incorrecta echo "blabla" | myprog 2 echo "blabla" | myprog 2 tu progtwig no se conoce como mygrog debes pasar la ruta completa. como lo hice ./main , ./ significa directorio actual.

Esto es solo mi opinión acerca de tu pregunta. Lea también la respuesta en el comentario dado por el Sr. William Pursell.

Déjame saber si tienes otras dudas.

No estoy seguro de cuál es exactamente tu pregunta, pero creo que puede ser “¿cómo trato la entrada de un archivo y la entrada de la consola de la misma manera?”.

¿ stdin que stdin (la entrada estándar) ya es un FILE * ? Eso significa que puedes pasarlo como el primer argumento a fscanf , al igual que un archivo “normal”:

 FILE *normal_file = fopen(...); // Read from normal file fscanf(normal_file, "%d", &x); // Read from stdin fscanf(stdin, "%d", &y); 

Una opción alternativa sería pasar el nombre del archivo como un argumento en su lugar.

  1. echo “blabla” | myprog 2 (número de palabras para imprimir)
  2. myprog 2 input.txt (número de palabras para imprimir)

Entonces tu

  • si argc == 1, proceda normalmente y procese stdin (stdin es un ARCHIVO *) con fgetc, u otro método f * alternativo.
  • Si argc == 2, obtenga el nombre de archivo de argv [1], use fopen (nombre de archivo) para obtener un ARCHIVO * y procesarlo.

De lo contrario, haría lo que Oli dijo y obtendría la primera palabra, luego fopen y pasarían a su función de procesamiento, o fseek (stdin, SEEK_SET, 0) y luego pasarían a stdin a su función de procesamiento.