elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema entrada estándar
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema entrada estándar  (Leído 3,512 veces)
fileteruso

Desconectado Desconectado

Mensajes: 18



Ver Perfil
Problema entrada estándar
« 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.


« Última modificación: 4 Diciembre 2018, 18:29 pm por fileteruso » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema entrada estándar
« Respuesta #1 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.


En línea

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

Desconectado Desconectado

Mensajes: 18



Ver Perfil
Re: Problema entrada estándar
« Respuesta #2 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.
En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Problema entrada estándar
« Respuesta #3 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. :-\
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Problema entrada estándar
« Respuesta #4 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



Saludos
« Última modificación: 4 Diciembre 2018, 19:55 pm por AlbertoBSD » En línea

fileteruso

Desconectado Desconectado

Mensajes: 18



Ver Perfil
Re: Problema entrada estándar
« Respuesta #5 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.
« Última modificación: 4 Diciembre 2018, 22:45 pm por fileteruso » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Problema entrada estándar
« Respuesta #6 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)



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
« Última modificación: 5 Diciembre 2018, 00:51 am por AlbertoBSD » En línea

fileteruso

Desconectado Desconectado

Mensajes: 18



Ver Perfil
Re: Problema entrada estándar
« Respuesta #7 en: 4 Diciembre 2018, 23:54 pm »

Ese es mi problema, justo.

Muchas gracias, por la atención de nuevo.
« Última modificación: 4 Diciembre 2018, 23:57 pm por fileteruso » En línea

CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Problema entrada estándar
« Respuesta #8 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.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: Problema entrada estándar
« Respuesta #9 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!
« Última modificación: 5 Diciembre 2018, 00:37 am por AlbertoBSD » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Leer de la entrada estandar linea por linea « 1 2 »
Programación C/C++
Delraich 15 11,752 Último mensaje 6 Julio 2010, 19:53 pm
por MIG80
Guardar entrada estandar en un archivo de texto
Programación C/C++
gonzaloi 8 4,278 Último mensaje 3 Abril 2011, 00:23 am
por leogtz
[C++] Consulta - Usar entrada estándar o desde un archivo
Programación C/C++
Lauta 8 4,038 Último mensaje 7 Octubre 2012, 08:02 am
por Lauta
Duda con redirección de entrada estándar en C++.
Programación C/C++
SARGE553413 1 2,527 Último mensaje 28 Mayo 2013, 13:09 pm
por flony
leer un array por entrada estandar (cmd)
Scripting
dijsktra 3 3,045 Último mensaje 1 Diciembre 2019, 04:29 am
por EdePC
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines