Foros del Web » Programación para mayores de 30 ;) » C/C++ »

copiar un archivo en otro archivo distinto en C

Estas en el tema de copiar un archivo en otro archivo distinto en C en el foro de C/C++ en Foros del Web. hola, como veran en el titulo necesito copiar un archivo en otro archivo distinto en C, mi problema esta que este es mi codigo y ...
  #1 (permalink)  
Antiguo 02/05/2015, 15:01
 
Fecha de Ingreso: febrero-2015
Mensajes: 20
Antigüedad: 9 años, 2 meses
Puntos: 0
copiar un archivo en otro archivo distinto en C

hola, como veran en el titulo necesito copiar un archivo en otro archivo distinto en C, mi problema esta que este es mi codigo y no llevo nada solo lo basico pero de una me sale segmentation fault, y no se por que,

Código HTML:
#include <stdio.h>  

int main (){
	
	FILE *file1 , *file2;
	char data1 ; 
	char data2 ;
	
	file1=fopen ("archi1.txt","r" );
	file2=fopen ("arhi2.txt" , "w");
	

	fclose (file1);
	fclose (file2);
	
	return 0;
}
lo que tenia pensado era despues de abrir los dos arichos, hacer :

[HTML
]while (feof(file1) !=0) {
data1= fgetc (file1);
data2 =data1;
fputc (data2, file2);
}
[/HTML]

pero no se si con eso haria la copia de file1 en file2 ;
  #2 (permalink)  
Antiguo 02/05/2015, 21:04
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 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/

Etiquetas: archivo.txt
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 03:02.