Autor
|
Tema: Archivos y Stdarg (Leído 2,604 veces)
|
Triper0
Desconectado
Mensajes: 38
|
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
|
|
« Última modificación: 2 Agosto 2011, 19:01 pm por Triper0 »
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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; salida = fopen(NOM_ARCHIVO_SALIDA , "a"); while (num_elem--){ while ((ch = fgetc(entrada )) != EOF ) } }
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
Mensajes: 38
|
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; salida = fopen(NOM_ARCHIVO_SALIDA , "a"); while (num_elem--){ while ((ch = fgetc(entrada )) != EOF ) } }
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
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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í?... 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
Mensajes: 38
|
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
|
|
|
|
|
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,396
|
22 Enero 2006, 23:53 pm
por Morris
|
|
|
Análisis archivos Extensiones cambiadas - Archivos camuflados - Contenido real
« 1 2 »
Software
|
Esgrimidor
|
11
|
9,718
|
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,337
|
10 Abril 2011, 01:02 am
por Songoku
|
|
|
headers cstdarg (stdarg.h)
Programación C/C++
|
Dark Invader
|
6
|
4,439
|
21 Junio 2011, 14:44 pm
por Dark Invader
|
|
|
Duda stdarg.h en C
Programación C/C++
|
jhonsc
|
6
|
3,492
|
2 Febrero 2012, 16:30 pm
por jhonsc
|
|