/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

leer nombre archivo x teclad y pasarselo a otra funcion

 
      Índice del Foro elrincondelc.com -> C/C++ en General
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
rzf1983



Registrado: 14 Ago 2007
Mensajes: 8

MensajePublicado: 16/10/2007 4:31 am
Título: leer nombre archivo x teclad y pasarselo a otra funcion

Hola, tengo desarrollada una aplicacion de compresión de audio. En la linea de comandos funciona d la maner siguiente:
\codificador.exe "archivoentrada.wav" "archivosalida.ogg"

Mi problema es q yo no kiero q ese sea mi "main" de mi aplicacion. Quiero que mi aplicacion tnga un "main" simple qu pida el archivo d entrada y el d salida y se lo pase a la funcion q ya tngo exa para comprimir y q aora mismo es la principal.

Ahora tengo int main (int agc, char ** argv) --> es el q codifica.

¿como sería el main que pide los archivos d salid y entrada y la cabecera nueva de mi funcion para comprimir?

Deberia ser sencillo pero de verda q nolo consigo
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3676
Ubicación: Mexico

MensajePublicado: 16/10/2007 7:30 am
Título:

Basta con declarar a la funcion main como una funcion que no recibe argumentos (la forma "int main(void)") y dentro de esta pides los datos al usuario. Por ultimo las dos cadenas de texto las pasas a tu funcion.

Me extraña que ya estes trabajando con esos archivos de datos (en formato wav y ogg) y se te haya pasado algo mucho mas sencillo.

Seria mas o menos asi (C estandar):
Código:
#include <stdio.h>
#include <stdlib.h>

void fn(char const *nom_entrada, char const *nom_salida);

int main(void)
{
   char nom_entrada[FILENAME_MAX];
   char nom_salida[FILENAME_MAX];
   
   printf("Archivo de entrada: ");
   fflush(stdout);
   if (fgets(nom_entrada, FILENAME_MAX, stdin) == NULL)
      return EXIT_FAILURE;
   
   printf("Archivo de salida: ");
   fflush(stdout);
   if (fgets(nom_salida, FILENAME_MAX, stdin) == NULL)
      return EXIT_FAILURE;
   
   fn(nom_entrada, nom_salida);
   
   return EXIT_SUCCESS;
}

void fn(char const *nom_entrada, char const *nom_salida)
{
   printf("entrada: \"%s\"", nom_entrada);
   printf("salida:  \"%s\"", nom_salida);
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
rzf1983



Registrado: 14 Ago 2007
Mensajes: 8

MensajePublicado: 16/10/2007 2:47 pm
Título:

Si, por eso decía que debia ser sencillo. Consguía hacerlo pero no de la forma que a mi me gutaba, por ejemplo, el nombre del archivo no podía tener espacios y detalles así. Muchas gracias por la respuesta, se agradece que pongas como lo harias, lo probaré. Gracias
Volver arriba
rzf1983



Registrado: 14 Ago 2007
Mensajes: 8

MensajePublicado: 16/10/2007 2:56 pm
Título:

He probado ese código. En mi programa, tu función fn que recibe los nombres de los archivos, abrirá dichos ficheros. Pues bien, me dise que el fichero de entrada esta vacio.
Volver arriba
rzf1983



Registrado: 14 Ago 2007
Mensajes: 8

MensajePublicado: 16/10/2007 3:56 pm
Título:

Ya lo he solucionado. Ahora tengo el problema de que no me funciona cuando tengo un archivo que tiene un espacio en su nombre, x ejemplo:

si kiero q el archivo de salida sea "mi salida.ogg" lo que me crea es un archivo llamado "mi". A ver si me exais una mano
Volver arriba
Karman



Registrado: 15 Oct 2005
Mensajes: 308

MensajePublicado: 16/10/2007 4:21 pm
Título:

utiliza scanf() y fflush() para liberar el buffer...
Código:

   fflush(stdout);
   if (scanf("%s",nom_entrada) == NULL)
      return EXIT_FAILURE;
   
   printf("Archivo de salida: ");
   fflush(stdout);
   if (scanf("%s",nom_salida) == NULL)
      return EXIT_FAILURE;


S2
_________________
www.inexinferis.co.nr

-. Karman .-
Volver arriba
rzf1983



Registrado: 14 Ago 2007
Mensajes: 8

MensajePublicado: 17/10/2007 2:52 am
Título:

si, con scanf() me coge los espacios, le paso los nombre de los archivos a la otra funcion y esta hace:

FILE *infile, *outfile;
outfile = fopen (nom_salida,"wb")

en ese fopen no me crea un nombre con espacios como x ejemplo "mi salida.ogg", sino que crea "mi".Aunque como he dixo scanf si lee los espacios.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3676
Ubicación: Mexico

MensajePublicado: 17/10/2007 7:04 am
Título:

Si estas utilizando scanf para leer los nombres de los archivos y solo te toma la primera palabra es porque scanf al ser utilizado con el indicador de tipo "%s" no lee lineas de texto sino palabras: secuencias de caracteres separadas por espacio blanco.

Si piensas utilizar scanf el indicador de tipo debe ser "%[^\n]", por ejemplo:
Código:
#include <stdio.h>
#include <stdlib.h>

void fn(char const *nom_entrada, char const *nom_salida);

int main(void)
{
   char nom_entrada[FILENAME_MAX];
   char nom_salida[FILENAME_MAX];
   
   printf("Archivo de entrada: ");
   fflush(stdout);
   if (scanf("%[^\n]", nom_entrada) == EOF)
      return EXIT_FAILURE;
   
   printf("Archivo de salida: ");
   fflush(stdout);
   /*
   ** Para eliminar el espacio blanco remanente de la
   ** linea anterior la cadena de formato en esta llamada
   ** DEBE INICIAR con un espacio.
   */
   if (scanf(" %[^\n]", nom_salida) == EOF)
      return EXIT_FAILURE;
   
   fn(nom_entrada, nom_salida);
   
   return EXIT_SUCCESS;
}

void fn(char const *nom_entrada, char const *nom_salida)
{
   printf("entrada: \"%s\"\n", nom_entrada);
   printf("salida:  \"%s\"\n", nom_salida);
}


Y si se desea utilizar fgets para leer los nombres de los archivos no se puede utilizar directamente el programa de mi primer mensaje porque este tiene un error: no elimina el caracter '\n' al final del archivo de texto y esto puede llevar a errores al tratar de abrir el archivo con fgets.

Para corregir el programa basta con eliminar ese caracter, por ejemplo utilizando strchr:
Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> /* strchr */

void fn(char const *nom_entrada, char const *nom_salida);

int main(void)
{
   char nom_entrada[FILENAME_MAX];
   char nom_salida[FILENAME_MAX];
   char *aux;
   
   printf("Archivo de entrada: ");
   fflush(stdout);
   if (fgets(nom_entrada, FILENAME_MAX, stdin) == NULL)
      return EXIT_FAILURE;
   if ((aux = strchr(nom_entrada, '\n')) != NULL)
      *aux = '\0';
   
   printf("Archivo de salida: ");
   fflush(stdout);
   if (fgets(nom_salida, FILENAME_MAX, stdin) == NULL)
      return EXIT_FAILURE;
   if ((aux = strchr(nom_salida, '\n')) != NULL)
      *aux = '\0';
   
   fn(nom_entrada, nom_salida);
   
   return EXIT_SUCCESS;
}

void fn(char const *nom_entrada, char const *nom_salida)
{
   printf("entrada: \"%s\"\n", nom_entrada);
   printf("salida:  \"%s\"\n", nom_salida);
}


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
      Índice del Foro elrincondelc.com -> C/C++ en General
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com