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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


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

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Archivos y Stdarg
« en: 2 Agosto 2011, 18:58 pm »

Bueno, mi problemita es el siguiente: Quiero hacer un programita que recorra como parámetro más de un archivo (una cantidad indeterminada) y que luego, en un archivo que se llame "concat.txt" concatene todos los archivos que se pasaron por parámetro.

Hice lo siguiente, pero me crea el "concat.txt" con un montón de "ÿÿÿ" que si lo dejo corriendo se me llena el rígido, junto con otros archivos .txt locos... Se ve que estoy haciendo algo mal.

Acá les dejo el código:

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

void concatenarArchivo (int cant, FILE *archEntrada, ...) {
char c;
//Declaramos el archivo que contendrá la concatenación de los demás archivos pasados por parámetro
FILE *archSalida;
FILE *arch;

//Utilizamos las funciones de stdarg para ir recorriendo la lista de argumentos
va_list a;
va_start(a,archEntrada);


while (cant--){
va_arg(a, FILE);
archSalida=fopen("concat.txt","at");
arch=fopen(a, "at");
while (!feof(arch)){
c= getc(arch);
putc(c, archSalida);
}
fclose(archSalida);
fclose(arch);
}
va_end(a);
}

int main(){
int cant=3;
FILE *archU;
FILE *archD;
FILE *archT;

archU=fopen("a.txt","r");
archD=fopen("b.txt","r");
archT=fopen("c.txt","r");

concatenarArchivo(cant, archU, archD, archT);

return 0;
}

Y en el caso de que se pasen 2 archivos por argumento, en vez de concatenarlo hay que copiarlo...

Los archivos del main son archivos que cree y los abrí directamente para probarlo, me interesa solamente que funcione la función concatenarArchivo



« Última modificación: 2 Agosto 2011, 19:01 pm por Triper0 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Archivos y Stdarg
« Respuesta #1 en: 2 Agosto 2011, 19:44 pm »

Tienes que darle un buen repaso a tu material de referencia ya que el programa tiene varios errores importantes y algunos de ellos de concepto.

Dentro de la función tratas de abrir los archivos cuando ya abriste estos en la función principal, también tratas a los objetos de tipo "FILE" (debería ser "FILE *") como cadenas de texto indicando el nombre de los archivos.

El programa corregido (compáralo con el original):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdarg.h>
  4.  
  5. #define NOM_ARCHIVO_SALIDA  "concat.txt"
  6.  
  7. void concatenar(int num_elem, ...);
  8.  
  9. int main(void)
  10. {
  11.   concatenar(3, "a.txt", "b.txt", "c.txt");
  12.  
  13.   return EXIT_SUCCESS;
  14. }
  15.  
  16. void concatenar(int num_elem, ...)
  17. {
  18.   FILE *entrada;
  19.   FILE *salida;
  20.   va_list va;
  21.   int ch;
  22.  
  23.   va_start(va, num_elem);
  24.   salida = fopen(NOM_ARCHIVO_SALIDA, "a");
  25.  
  26.   while (num_elem--){
  27.      entrada = fopen(va_arg(va, char const *), "r");
  28.  
  29.      while ((ch = fgetc(entrada)) != EOF)
  30.         fputc(ch, salida);
  31.      fclose(entrada);
  32.   }
  33.  
  34.   fclose(salida);
  35.   va_end(va);
  36. }

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Archivos y Stdarg
« Respuesta #2 en: 2 Agosto 2011, 20:27 pm »

Tienes que darle un buen repaso a tu material de referencia ya que el programa tiene varios errores importantes y algunos de ellos de concepto.

Dentro de la función tratas de abrir los archivos cuando ya abriste estos en la función principal, también tratas a los objetos de tipo "FILE" (debería ser "FILE *") como cadenas de texto indicando el nombre de los archivos.

El programa corregido (compáralo con el original):
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdarg.h>
  4.  
  5. #define NOM_ARCHIVO_SALIDA  "concat.txt"
  6.  
  7. void concatenar(int num_elem, ...);
  8.  
  9. int main(void)
  10. {
  11.   concatenar(3, "a.txt", "b.txt", "c.txt");
  12.  
  13.   return EXIT_SUCCESS;
  14. }
  15.  
  16. void concatenar(int num_elem, ...)
  17. {
  18.   FILE *entrada;
  19.   FILE *salida;
  20.   va_list va;
  21.   int ch;
  22.  
  23.   va_start(va, num_elem);
  24.   salida = fopen(NOM_ARCHIVO_SALIDA, "a");
  25.  
  26.   while (num_elem--){
  27.      entrada = fopen(va_arg(va, char const *), "r");
  28.  
  29.      while ((ch = fgetc(entrada)) != EOF)
  30.         fputc(ch, salida);
  31.      fclose(entrada);
  32.   }
  33.  
  34.   fclose(salida);
  35.   va_end(va);
  36. }

Un saludo

Un millón de gracias, si... Me mandé varios mocos...
Una cosa que no entiendo es la linea esta:

Código:
      entrada = fopen(va_arg(va, char const *), "r");

La parte de "char const *" sería como decirle que va a encontrar una constante de caracteres, o sea "FILE" y le asignas el '*'... ¿O algo así?...
Eso no lo entendí muy bien...

El resto perfecto...

DESDE YA, UN MILLÓN Y MEDIO DE GRACIAS  ;-)
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Archivos y Stdarg
« Respuesta #3 en: 3 Agosto 2011, 01:35 am »

Una cosa que no entiendo es la linea esta:

Código:
      entrada = fopen(va_arg(va, char const *), "r");

La parte de "char const *" sería como decirle que va a encontrar una constante de caracteres, o sea "FILE" y le asignas el '*'... ¿O algo así?...
No.

Se utiliza la macro "va_arg" para obtener cada uno de los argumentos sin nombre (los que sustituyen a "...", en tu caso los tres nombres de archivo).

El segundo argumento de "va_arg" debe ser el tipo, en tu caso utilizamos "char const *" ya que ese es el tipo de las literales de cadena como "a.txt".

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Triper0

Desconectado Desconectado

Mensajes: 38



Ver Perfil
Re: Archivos y Stdarg
« Respuesta #4 en: 3 Agosto 2011, 05:30 am »

No.

Se utiliza la macro "va_arg" para obtener cada uno de los argumentos sin nombre (los que sustituyen a "...", en tu caso los tres nombres de archivo).

El segundo argumento de "va_arg" debe ser el tipo, en tu caso utilizamos "char const *" ya que ese es el tipo de las literales de cadena como "a.txt".

Un saludo


A buenísimo, ese dato del "char const *" no lo tenía... Muchas gracias nuevamente...

¡Saludos!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
como puedo convertir archivos flash ha archivos de videos
Diseño Gráfico
asitaka_kintaro 3 6,402 Último mensaje 22 Enero 2006, 23:53 pm
por Morris
Análisis archivos Extensiones cambiadas - Archivos camuflados - Contenido real « 1 2 »
Software
Esgrimidor 11 9,738 Último mensaje 24 Septiembre 2011, 01:53 am
por Esgrimidor
Cómo? Modificar archivos de la carpeta archivos de programas en windows 7 « 1 2 »
Windows
anonimo12121 10 23,364 Último mensaje 10 Abril 2011, 01:02 am
por Songoku
headers cstdarg (stdarg.h)
Programación C/C++
Dark Invader 6 4,459 Último mensaje 21 Junio 2011, 14:44 pm
por Dark Invader
Duda stdarg.h en C
Programación C/C++
jhonsc 6 3,504 Último mensaje 2 Febrero 2012, 16:30 pm
por jhonsc
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines