Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: fileteruso en 4 Diciembre 2018, 18:26 pm



Título: Problema entrada estándar
Publicado por: fileteruso en 4 Diciembre 2018, 18:26 pm
Buenas a todos,

suponiendo que se tiene el archivo programa.c, que imprime la cadena que se le pasa por entrada estándar en el terminal de la siguiente forma:

echo "abcdef" | ./programa

como puedo hacer para que imprima abcdef por salida estándar, y que si ejecuto el programa sin entrada

./programa

que no imprima nada y no se quede esperando a introducir nada por teclado.

Muchas gracias a todos.


Título: Re: Problema entrada estándar
Publicado por: K-YreX en 4 Diciembre 2018, 18:39 pm
Puede que alguna vez te hayas encontrado con la función <main> con el siguiente formato:
Código
  1. int main(int argc, char *argv[]){
  2. }

Eso significa que <argc> contiene el número de argumentos que se han pasado al programa y <argv> contiene cadenas de caracteres con los parámetros que se han escrito al ejecutar el programa. Luego ya es adaptar tu programa según el valor de <argc>. Suerte.


Título: Re: Problema entrada estándar
Publicado por: fileteruso en 4 Diciembre 2018, 18:50 pm
Muchas gracias por responder, el problema que tengo es que si yo en el terminal escribo:

echo "123456" | ./programa

el número de argumentos es 1, que, si no me equivoco, es el propio programa, y si escribo:

./programa

el número de argumentos también es 1.

Esto me impide diferenciar cuando escribo el programa de la forma ./programa, que debería no devolver nada, y el echo "123456" | ./programa que debería devolver 123456.

Muchas gracias.


Título: Re: Problema entrada estándar
Publicado por: K-YreX en 4 Diciembre 2018, 19:00 pm
Y no te sirve ejecutar <./programa 123456>??
La otra forma no se me ocurre nada por el momento ya que no he trabajado nunca con un programa en C y un pipe del terminal. :-\


Título: Re: Problema entrada estándar
Publicado por: AlbertoBSD en 4 Diciembre 2018, 19:16 pm
echo "123456" | ./programa

Eso es como si ejecutaras el programa y este pidera informacion
Código:
Ingrese el numero X:
Entonces lo que le pasaste como 123456 mediante el Echo se ingresa en esa primera pregunta ya sea un scanf o un fgets o un cin

Ejemplo:

Código
  1. #include<stdio.h> //Funciones printf, fgets
  2. #include<string.h> //Funciones printf, fgets
  3.  
  4.  
  5. int main() {
  6. char temp[100];
  7. do {
  8. printf("> ");
  9. fgets(temp,100,stdin);
  10. printf("Escribio : %s",temp);
  11. }while(strncmp(temp,"exit",4));
  12. }
  13.  

entrada.txt
Código:
hola
esto es una pruba
de codigo al salir con
exit


(http://i.imgur.com/N4BTDo2.png) (https://imgur.com/N4BTDo2)
Saludos


Título: Re: Problema entrada estándar
Publicado por: fileteruso en 4 Diciembre 2018, 22:36 pm
Muchas gracias por responder,

he adaptado tu respuesta a mi problema, por lo cual he puesto:

Código
  1. # include <stdio.h>
  2. # include <string.h>
  3.  
  4. int main(){      
  5.    char temp[2048];
  6.    if(strncmp(temp, "\n", 4)){
  7.      fgets(temp,2048,stdin);
  8.      printf("%s",temp);
  9.    }
  10.  
  11.   return 0;
  12. }
  13.  

el problema que tengo es que si pongo echo "123456" | ./programa me devuelve lo que quiero, que es 123456, sin embargo si lo escribo solo ./programa se queda esperando a que introduzca algo para imprimirlo por pantalla, y eso es lo que no quiero que ocurra; lo que necesito es que si ejecuto ./programa se ejecute y acabe sin esperar a que introduzca nada.

Muchas gracias otra vez.


Título: Re: Problema entrada estándar
Publicado por: AlbertoBSD en 4 Diciembre 2018, 23:41 pm
Ya entendi, lo que quieres es que si hay algo en la entrada estandar lo procese, si no, simplemente termine.

te convendría revisar el siguiente tema ¿Queda algo en el Buffer de Entrada stdin? (Solucionado) (https://foro.elhacker.net/programacion_cc/iquestqueda_algo_en_el_buffer_de_entrada_stdin_solucionado-t489993.0.html)



Asi no se puede hacer lo que dices con metodos estadar (Segun creo no se puede).

El punto esta en que la mayoria de las funciones tipo getchar, getc, fgets etc......  se quedan esperando entrada hasta que lea algo.

Yo intenten validar si habia algo en la entrada estandar mediante el uso de feof, pero resulta que para Stdin nunca es el FIN del archivo, como lo muestro en una de las replies el link que te pase. sin embargo no se si funcione para el metodo que muestras de echo .... o type. Voy a probarlo y te comento.

Saludos


Título: Re: Problema entrada estándar
Publicado por: fileteruso en 4 Diciembre 2018, 23:54 pm
Ese es mi problema, justo.

Muchas gracias, por la atención de nuevo.


Título: Re: Problema entrada estándar
Publicado por: CalgaryCorpus en 5 Diciembre 2018, 00:02 am
Si presionas ^D (Control D) en linux o ^Z en windows, generas un eof para la entrada estandar.


Título: Re: Problema entrada estándar
Publicado por: AlbertoBSD en 5 Diciembre 2018, 00:22 am
Si presionas ^D (Control D) en linux o ^Z en windows, generas un eof para la entrada estandar.

Interesante, si es cierto que cuand quiero salir de una terminal linux rapidamente presiono control D y para windows no me sabia lo del control z.

Sin embargo el OP trata de automatizar alguna tarea, que cuando envie texto mediante Echo al programa, este lo capture y lo procese, y cuando envié alguna cadena vacia, no se quede esperando el programa.

Saludos!


Título: Re: Problema entrada estándar
Publicado por: CalgaryCorpus en 5 Diciembre 2018, 01:50 am
Esto puede servir:

https://stackoverflow.com/questions/1312922/detect-if-stdin-is-a-terminal-or-pipe


Título: Re: Problema entrada estándar
Publicado por: AlbertoBSD en 5 Diciembre 2018, 04:24 am
Esto puede servir:

https://stackoverflow.com/questions/1312922/detect-if-stdin-is-a-terminal-or-pipe


Interesante si funciono en Windows  ;-)

Código:
#include<stdio.h>
#include<unistd.h>

int main() {
if (!isatty(fileno(stdin))){
char temp[100];
fgets(temp,100,stdin);
printf("%s",temp);
}
}