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.
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.
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.
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. :-\
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
(http://i.imgur.com/N4BTDo2.png) (https://imgur.com/N4BTDo2)
Saludos
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.
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
Ese es mi problema, justo.
Muchas gracias, por la atención de nuevo.
Si presionas ^D (Control D) en linux o ^Z en windows, generas un eof para la entrada estandar.
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!
Esto puede servir:
https://stackoverflow.com/questions/1312922/detect-if-stdin-is-a-terminal-or-pipe
Cita de: CalgaryCorpus en 5 Diciembre 2018, 01:50 AM
Esto puede servir:
https://stackoverflow.com/questions/1312922/detect-if-stdin-is-a-terminal-or-pipe
Interesante si funciono en Windows ;-)
#include<stdio.h>
#include<unistd.h>
int main() {
if (!isatty(fileno(stdin))){
char temp[100];
fgets(temp,100,stdin);
printf("%s",temp);
}
}