Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/05/2015, 21:04
Avatar de vangodp
vangodp
 
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: copiar un archivo en otro archivo distinto en C

No use feof para la condicion del bucle. Mejor no lo uses nunca XDDD. O casi nunca.

Mejor usar el proprio valor de retorno de fgetc que retorna un entero igual a EOF si llegamos al fin del archivo, o la letra leida en formato decimal. Resultado.. No necesitamos a feof en ese ejemplo.
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main () {
  4.  
  5.     FILE *file1 , *file2;
  6.     int data1 =0;
  7.    
  8.     file1 = fopen ( "original.txt", "r" );
  9.     file2 = fopen ( "copia.txt" , "w" );
  10.    
  11.     while ( (data1 = fgetc ( file1 )) != EOF ) {
  12.         fputc ( data1, file2 );
  13.     }
  14.    
  15.     fclose ( file1 );
  16.     fclose ( file2 );
  17.    
  18.     return 0;
  19. }

La razon por la que es mejor usar el valor de retorno de la propria funcion fgetc y no el de feof es que feof solo va retornar 0 si falla fgetc. Una posible solucion es poner antes del bucle una lectura previa con fgetc de esta forma:
Código C:
Ver original
  1. data1 = fgetc(file1);
  2.     while( !feof(file1) ){
  3.         fputc(data1, file2);
  4.         data1 = fgetc(file1);
  5.     }
En este caso si falla fgetc o resulta que no hay nada que leer no se entra al bucle. =)
Si haces como en tu ejemplo veras que se imprime una letra de más en el archivo y esto es por lo que comente antes, fgetc retorna EOF en caso llegado al fin del archivo, y solo entonces despues de eso es cuando feof falla, pero no si antes imprimir ese EOF sobrante con el fputc.
Código C:
Ver original
  1. while( !feof(file1) ){
  2.         data1 = fgetc(file1);
  3.         fputc(data1, file2);
  4.     }
Total, son mil razones para no usar feof, tenga en cuanta que feof depende de otras funciones para que retorne 0, pero esas mismas funciones tienen sus valores de retorno, es solo investigar como funcionan todas ellas y tendras más control sobre tu programa.
No en todos los casos se desaconceja usar feof, solo que debes investigar más sobre su funcionamiento.
http://www.cplusplus.com/reference/cstdio/feof/
http://www.cplusplus.com/reference/cstdio/fgetc/
http://www.cplusplus.com/reference/cstdio/fputc/