Duda programacion en C...

Umm... se me pide copiar un archivo, pero de momento apenas he tocado manejo de archivos por lo que mi código ha quedado tal que así:

#include <stdio.h>


int main()
{
   FILE *archivo, *f;
   char nombre[100],nombre2[100];
   
   archivo=NULL;
   f=NULL;
   
   printf("Introduce el nombre del archivo a copiar:\n");
   scanf("%s", nombre);

   if(!(archivo=fopen(nombre, "r"))){
      printf("Error al abrir archivo\n");
      return 1;
   }else{
      printf("Introduce el nombre del nuevo archivo:\n");
      scanf("%s", nombre2);
      if(!(f=fopen(nombre2, "w"))){
         printf("Error al crear archivo\n");
         return 1;
         }
   }   
   if(fwrite(archivo, ¿¿??, ¿¿??,f))
      printf("Copia completada\n");
   fclose(f);
   fclose(archivo);
   return 0;
}
   
   


Me parece que existe una función para copiar directamente archivos en C, pero me gustaría ver si mi idea es viable, abrir un archivo en modo lectura, y mediante fwrite copiar su contenido en un segundo. La función fwrite la he utilizado para copiar variables a un archivo mediante la estructura:

fwrite(variable, tamaño_tipo_variable, tamaño_variable, destino)

Pero como en este caso quiero copiar el contenido de un archivo a otro, de antemano no conozco el tamaño de éste ¿Alguna función que me lo devuelva?Al igual que puedo hacer un sizeof(int), ¿como puedo hacer lo mismo con un tipo de dato FILE? He probado algunas cosas pero no me ha devuelto ningún dato satisfactorio... [burla3] ¿Tal vez lo que estoy intentando es imposible con fwrite? Gracias de antemano, llevo un rato dando vueltas a esto...

PD: No hemos dado nada de punteros... la semana que viene nos ponemos con ellos...
Hola, busca como funciona la función fseek. A ver si te sirve.

Un saludo

Pd. Otra opción sería con un while/for comprobando que lo obtenido sea distinto de EOF.
La opción del bucle while/for ya se me habia ocurrido, utilizando tambien la función feof... pero el valor devuelto es el que tengo que poner en las dos opciones de fwrite¿? Es este punto el que no me ha quedado claro, porque eso seria el tamaño para el tercer el argumento pero en el segundo¿? :( lo siento soy un mar de dudas...
A ver, es muy sencillo. Un bucle while, un fread y un fwrite bastan. Mírate bien cómo funcionan fread y fwrite. Lees con fread, lo guardas en un array, si se han leído datos lo escribes, y repites. El fread lo puedes poner en el condicional del bucle, ya que devuelve el número de datos leídos.

Prueba y si te atascas te doy más pistas :P

Te pongo el manpage de fread y fwrite por si no lo tienes a mano:

FREAD(3)                   Linux Programmer's Manual                  FREAD(3)

NAME
       fread, fwrite - binary stream input/output

SYNOPSIS
       #include <stdio.h>

       size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

       size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);

DESCRIPTION
       The  function  fread()  reads  nmemb  elements of data, each size bytes
       long, from the stream pointed to by stream, storing them at  the  loca‐
       tion given by ptr.

       The  function  fwrite()  writes nmemb elements of data, each size bytes
       long, to the stream pointed to by stream, obtaining them from the loca‐
       tion given by ptr.

       For non-locking counterparts, see unlocked_stdio(3).

RETURN VALUE
       fread()  and  fwrite()  return the number of items successfully read or
       written (i.e., not the number of characters).  If an error  occurs,  or
       the  end-of-file is reached, the return value is a short item count (or
       zero).

       fread() does not distinguish between end-of-file and error, and callers
       must use feof(3) and ferror(3) to determine which occurred.

CONFORMING TO
       C89, POSIX.1-2001.

SEE ALSO
       read(2), write(2), feof(3), ferror(3), unlocked_stdio(3)

COLOPHON
       This  page  is  part of release 3.23 of the Linux man-pages project.  A
       description of the project, and information about reporting  bugs,  can
       be found at http://www.kernel.org/doc/man-pages/.

GNU                               1996-05-17                          FREAD(3)
Vale. No sabia si se podia hacer directamente de fichero a fichero, si lo guardo en un array no creo que haya mas problemas, ya me ha tocado hacer en esta tirada tambien uno que cuente las lineas de un fichero y lo guarde en un tercero, por lo que este entonces seria muy similar...
4 respuestas