Fusionar dos ficheros en C

Supongamos que quiero fusionar dos archivos:
a) Imagen en x formato
b) Cualquier archivo comprimido en un rar

De manera que al abrir la imagen de manera normal la muestre como siempre pero al "abrirla como winrar" se muestre el archivo que hay dentro.

Eso lo he conseguido con la siguiente instrucción:

system("copy /b a.jpg + b.rar fusion.jpg");


Cual seria su equivalente en codigo c? Manejando ficheros...
Por ahora lo que tengo implementado en código sería:

FILE *dir1;
FILE *dir2;
FILE *dir3;

void main()
{
   char f[10]="b.rar";
   char r[10]="a.jpg";
   char f2[10]="fusion.jpg";
   char leer[1023];

   dir1 = fopen(f,"rb");


   dir2 = fopen(r,"rb");


   dir3 = fopen(f2,"wb");

   while (f != EOF)
   {
      fread(&leer, sizeof(leer),1023,dir1);
      fwrite(&leer, sizeof(leer),1023,dir3);
   }

   

}



No tengo ni idea de como continuar ni si lo que he hecho hasta ahora es correcto, ¿podriais echarme una mano?


GRASIAS DE HANTEVRASO
Manejas mal los ficheros. f es una cadena, no un fichero, no tiene sentido que lo compares con EOF. Por otra parte, el final de un fichero en C no se comprueba así sino mediante feof. Tampoco los cierras.

Si lo que lees lo metes en un array de chars, en el fread el parámetro del tamaño debería ser (sizeof)char, y lo mismo para el fwrite, pues leer no es un char sino un array de char, sizeof devuelve el tamaño total del array por lo que intentas guardar 1023*1023(sizeof(char)) en un array de 1023 elementos.

fread devuelve un entero que es el número de caracteres leídos, deberías almacenarlo y pasárselo al fwrite (en vez del 1023), porque si se encuentra al final del fichero y lee menos caracteres del máximo tú seguirás escribiendo la cadena entera con parte del contenido de la iteración anterior.

Para copiar el segundo fichero sólo has de proceder igual, leyendo del otro archivo.

Ojo, no sé si el resultado de ese proceso es equivalente al copy de batch, sólo te digo lo que veo mal del código en C (y puede que me deje cosas o me equivoque, tengo el C oxidado :P).
amuchamu escribió:Manejas mal los ficheros. f es una cadena, no un fichero, no tiene sentido que lo compares con EOF. Por otra parte, el final de un fichero en C no se comprueba así sino mediante feof. Tampoco los cierras.

Si lo que lees lo metes en un array de chars, en el fread el parámetro del tamaño debería ser (sizeof)char, y lo mismo para el fwrite, pues leer no es un char sino un array de char, sizeof devuelve el tamaño total del array por lo que intentas guardar 1023*1023(sizeof(char)) en un array de 1023 elementos.

fread devuelve un entero que es el número de caracteres leídos, deberías almacenarlo y pasárselo al fwrite (en vez del 1023), porque si se encuentra al final del fichero y lee menos caracteres del máximo tú seguirás escribiendo la cadena entera con parte del contenido de la iteración anterior.

Para copiar el segundo fichero sólo has de proceder igual, leyendo del otro archivo.

Ojo, no sé si el resultado de ese proceso es equivalente al copy de batch, sólo te digo lo que veo mal del código en C (y puede que me deje cosas o me equivoque, tengo el C oxidado :P).


El método de leer el primer fichero guardandolo en un tercer fichero creado y cuando termine hacer la continuación igual con el segundo no sé si es correcto, ya sé que la manera que hago el fread y el fwrite no es correcta pero aparte que no sé ni como hacer esa gilipollez bien tampoco se si es correcto lo de mezclar uno después del otro...

Alguien que pueda implementar CORRECTAMENTE el código y me confirme que funka?:/
Yo puedo hacer el programa pero no lo puedo comprobar en winrar (no uso windows). He hecho la prueba y el archivo resultante es detectado como imagen, y de dos programas de compresión que he probado uno puede extraer sin problemas, el otro dice "Tipo de archivador no soportado." pero si le cambio la extensión a rar (sólo el nombre) lo lee sin problemas. Así que, en principio, parece que el método funciona pero lo tiene que soportar el programa de compresión.

Te pongo el código:

#include <stdio.h>

#define BUFFER_SIZE 1024

int main(int argc, char* argv[]){
   FILE *o1, *o2, *d;
   unsigned int n_read;
   char buffer[BUFFER_SIZE];
   
   o1 = fopen(argv[1], "rb");
   o2 = fopen(argv[2], "rb");
   d  = fopen(argv[3], "wb");
   
   while (!feof(o1)){
      n_read = fread(buffer, sizeof(char), BUFFER_SIZE, o1);
      fwrite(buffer, sizeof(char), n_read, d);
   }
   
   while (!feof(o2)){
      n_read = fread(buffer, sizeof(char), BUFFER_SIZE, o2);
      fwrite(buffer, sizeof(char), n_read, d);
   }
   
   close(o1);
   close(o2);
   close(d);
   
   return 0;
}

Hay que pasarle 3 parámetros: los nombres de los dos ficheros de origen y el del fichero resultante. No hace ninguna comprobación, así que si no se meten los 3 parámetros, los ficheros de origen no existen o no se pueden leer o el de destino no se puede crear o escribir en él, el programa petará.
3 respuestas