Archivos y Stdarg

Iniciado por Triper0, 2 Agosto 2011, 18:58 PM

0 Miembros y 1 Visitante están viendo este tema.

Triper0

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:

#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


rir3760

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):
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#define NOM_ARCHIVO_SALIDA  "concat.txt"

void concatenar(int num_elem, ...);

int main(void)
{
   concatenar(3, "a.txt", "b.txt", "c.txt");
   
   return EXIT_SUCCESS;
}

void concatenar(int num_elem, ...)
{
   FILE *entrada;
   FILE *salida;
   va_list va;
   int ch;
   
   va_start(va, num_elem);
   salida = fopen(NOM_ARCHIVO_SALIDA, "a");
   
   while (num_elem--){
      entrada = fopen(va_arg(va, char const *), "r");
     
      while ((ch = fgetc(entrada)) != EOF)
         fputc(ch, salida);
      fclose(entrada);
   }
   
   fclose(salida);
   va_end(va);
}


Un saludo
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

Cita de: rir3760 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):
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>

#define NOM_ARCHIVO_SALIDA  "concat.txt"

void concatenar(int num_elem, ...);

int main(void)
{
   concatenar(3, "a.txt", "b.txt", "c.txt");
   
   return EXIT_SUCCESS;
}

void concatenar(int num_elem, ...)
{
   FILE *entrada;
   FILE *salida;
   va_list va;
   int ch;
   
   va_start(va, num_elem);
   salida = fopen(NOM_ARCHIVO_SALIDA, "a");
   
   while (num_elem--){
      entrada = fopen(va_arg(va, char const *), "r");
     
      while ((ch = fgetc(entrada)) != EOF)
         fputc(ch, salida);
      fclose(entrada);
   }
   
   fclose(salida);
   va_end(va);
}


Un saludo

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

      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  ;-)

rir3760

Cita de: Triper0 en  2 Agosto 2011, 20:27 PMUna cosa que no entiendo es la linea esta:

      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
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

Cita de: rir3760 en  3 Agosto 2011, 01:35 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!