Problema entrada estándar

Iniciado por fileteruso, 4 Diciembre 2018, 18:26 PM

0 Miembros y 4 Visitantes están viendo este tema.

fileteruso

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.

K-YreX

Puede que alguna vez te hayas encontrado con la función <main> con el siguiente formato:

int main(int argc, char *argv[]){
}


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.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

fileteruso

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.

K-YreX

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. :-\
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

AlbertoBSD

#4
Cita de: fileteruso en  4 Diciembre 2018, 18:50 PM
echo "123456" | ./programa

Eso es como si ejecutaras el programa y este pidera informacion
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:

#include<stdio.h> //Funciones printf, fgets
#include<string.h> //Funciones printf, fgets


int main() {
char temp[100];
do {
printf("> ");
fgets(temp,100,stdin);
printf("Escribio : %s",temp);
}while(strncmp(temp,"exit",4));
}


entrada.txt

hola
esto es una pruba
de codigo al salir con
exit




Saludos
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

fileteruso

#5
Muchas gracias por responder,

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


# include <stdio.h>
# include <string.h>

int main(){      
   char temp[2048];
   if(strncmp(temp, "\n", 4)){
     fgets(temp,2048,stdin);
     printf("%s",temp);
   }

  return 0;
}


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.

AlbertoBSD

#6
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)



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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

fileteruso

#7
Ese es mi problema, justo.

Muchas gracias, por la atención de nuevo.

CalgaryCorpus

Si presionas ^D (Control D) en linux o ^Z en windows, generas un eof para la entrada estandar.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

AlbertoBSD

#9
Cita de: 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.

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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW