Copiar contenido del fichero en otro en C (solucionado)

Iniciado por Pirata LOL, 7 Marzo 2011, 03:38 AM

0 Miembros y 1 Visitante están viendo este tema.

Pirata LOL

sin usar cadenas.. el archivo 1 ya esta creado con contenido

llevo esta funcion y nose que hacer

void crear_datosout(void)
{
FILE *ptrdatos,*ptrdatos2;
char caracter,caracter2;
ptrdatos=fopen("archivo1.txt","rt");
ptrdatos2=fopen("archivo2.txt","wt");
while (caracter!=EOF)
{
if (caracter>=92 && <=122)
{
caracter=fgetc(ptrdatos);
caracter2=caracter;
fputc(caracter2,ptrdatos2);
}
fclose(archivo1);
fclose(archivo2);
}


que hago?? :-\
[center[/center]

Akai

Estás cometiendo un fallo. Tu únicamente consideras que vas a copiar letras. Pero y los espacios o saltos de linea? y otros caracteres especiales?

por otro lado, yo lo enfocaría más como un
do{
lo que sea
}while(tu verás)

Ya que de esta forma te aseguras que si el fichero estuviese vacío (sólo contuviese el final de fichero) copiases el final de fichero, o en un fichero no vacío, copiases también el final de fichero.

4rkn63l

#2
A como dice Akai, estas pasando por alto los saltos de lineas, los espacios en blanco y mas importante aun el EOF. Si tu intencion es copiar solo letras del abecedario en todo caso seria comparar que el valor ascii es >=97 y no >=92 ya que si te fijas en la tabla ascii el valor 92 corresponde al caracter '\'.

En todo caso te dejo mi version del programa...tenia rato de no escribir codigo en C  :)


#include <stdio.h>
#include <stdlib.h>
/*copy_file recibe como parametro el nombre del fichero origen y el nombre del fichero destino
donde se copiara, devuelve 1 si se copio exitosamente,0 en caso contario*/
int copy_file(char* f_org,char* f_dest);
int main()
{
if(!copy_file("fichero1.txt","fichero2.txt"))
               printf("El fichero no se pudo copiar\n");
else
       printf("Fichero copiado exitosamente\n");

return 0;
}
int copy_file(char* f_org,char* f_dest)
{
FILE *fp_org,*fp_dest;
char c;

if(!(fp_org=fopen(f_org,"rt")) || !(fp_dest=fopen(f_dest,"wt")))
{
perror("Error de apertura de ficheros");
exit(EXIT_FAILURE);
}

while((c=fgetc(fp_org))!=EOF && !ferror(fp_org) && !ferror(fp_dest))
fputc(c,fp_dest);

if(ferror(fp_org) || ferror(fp_org))
return 1;

fclose(fp_org);
fclose(fp_dest);
return 0;
}

Pirata LOL

#3
ambos se equivocan o no se dieron cuenta.. eso que intentan corregirme ya lo pense y lo corregi en esto
if (caracter>=97 && <=122)

estoy utilizando la tabla ASCII y eso incluye solo las letras minusculas :)

pero probare el codigo de 4rkn63l luego de que arreglue un problema con el compilador de geany en windows gracias Luego respondo a ver si solucione el tema
[center[/center]

4rkn63l

Cita de: Pirata LOL en 10 Marzo 2011, 04:10 AM
ambos se equivocan o no se dieron cuenta.. eso que intentan corregirme ya lo pense y lo corregi en esto
if (caracter>=97 && <=122)

omg....

Citar
Si tu intencion es copiar solo letras del abecedario en todo caso seria comparar que el valor ascii es >=97 y no >=92 ya que si te fijas en la tabla ascii el valor 92 corresponde al caracter '\'.

Akai

Cita de: Pirata LOL en 10 Marzo 2011, 04:10 AM
estoy utilizando la tabla ASCII y eso incluye solo las letras minusculas :)

Lo que te intenté decir, y veo que parece ser has obviado, es que estás ignorando los espacios, los saltos de linea, los números y todo lo que no sean letras.

La tabla ASCII incluye letras mayúsculas, minúsculas, números, y unos cuantos caracteres especiales que suman más que todos los anteriores juntos. Tu verás.

PD: Para Windows, posiblemente, te interese usar Code::Blocks (IDE) con mingw (compilador).

Pirata LOL

jeje 4rkn63l si leí tu comen sobre la corrección del if >=97  :-[
se me olvido agradecerte por esa parte... y Akai creo q tienes razon me podrias decir que hacer para que incluya todo? 2 ciclos? o que tipo de condicion  :-\
[center[/center]

Pirata LOL

ya arregle el compilador pero probe el codigo de 4rkn63l
y me dio muchos errores.. incontables  :silbar:
algunas duditas sobre tu codigo
Citarint copy_file(char* f_org,char* f_dest);
int main()
{
   if(!copy_file("fichero1.txt","fichero2.txt"))
                printf("El fichero no se pudo copiar\n");
   else
           printf("Fichero copiado exitosamente\n");

   return 0;
}
:huh: esta parte del codigo la incluyo en la funcion principal? antes del menu? :huh:

void copy_file(void)
Citarif(!(fp_org=fopen(f_org,"rt")) || !(fp_dest=fopen(f_dest,"wt")))

if(!(fp_org=fopen(f_org.txt,"rt")) || !(fp_dest=fopen(f_dest.txt,"wt")))
{
printf("Error de apertura de ficheros");
exit(EXIT_FAILURE);
}

le agregue el tipo de archivo al txt y use el printf :rolleyes:

Lo demás lo deje igual y aun así no copia me puedes decir si ya lo probaste? :huh:
y de ser así y te funcionó podrias decirme en que me equivoco??

Disculpen las molestias pero si no domino una simple copia de archivo no podre avanzar con ejercicios mas complejos y no es la idea  :-[
[center[/center]

4rkn63l

Citar:huh: esta parte del codigo la incluyo en la funcion principal? antes del menu? :huh:

A que menu te refieres? Recuerda que la version de la funcion que hice yo, tiene distinta definicion tanto de parametros como de valor de retorno, asi que si lo que quieres es implementarla en el programa que estes realizando, deberas de copiar la declaracion(antes de main) y la definicion(despues de main) de la funcion y luego hacer la llamada a dicha funcion desde main, ahora si el programa que estas haciendo es solo para realizar la tarea de copiar los ficheros, pues ya tenes el programa completo ahi.

El programa lo compile en linux con gcc y anda bien...compilastes mi version del programa sin ningun cambio? Que errores te da?? Que compilador estas usando?

Akai

te lo pongo en pseudocódigo, a partir de ahi ya te apañas tu


f1=abrir_fichero(1.lectura)
f2=abrir_fichero(2,esctritura)

do{
c=leer_caracter(1)
escribir_caracter(2,c)
}while(c!=EOF)

cerrar_fichero(1)
cerrar_fichero(2)