Duplicar un archivo de texto plano con lenguaje C.

Iniciado por DanielPy, 3 Marzo 2015, 17:22 PM

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

DanielPy

Hola gente.
La lógica es que consultemos cuando un programa no funciona por algún error de sintaxis o lógica, en este caso es algo distinto porque como algunos conocen por mi edad no tengo otra posibilidad de consulta que no sean los foros.-
El caso es, alguien me puede decir si esta es una manera correcta de duplicar un archivo, me refiero a fgets y fputs, con estas 2 funciones tengo la seguridad de que no voy a tener problema para leer y escribir contenga lo que contenga un archivo con texto plano ?.- 

/* Programa para copiar un archivo en otro*/
#include <stdio.h>

int main(){
char temp[100];
FILE *ptrOrigen = fopen( "cliente.txt", "r");
FILE *ptrCopia  = fopen( "clienteCopia", "w");

if( ptrOrigen == NULL || ptrCopia == NULL ){
printf(" \n\n Error al abrir ficheros... ");
}
else{
printf( "\n Se muestra el archivo copiado...\n\n" );
while( fgets( temp, 100, ptrOrigen) ){
fputs( temp, ptrCopia );
printf( " %s", temp );
}
}

fclose(ptrOrigen);
fclose(ptrCopia);

getchar();
return 0;
}


Desde ya muchas gracias por la ayuda que deseen brindarme.-
Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

engel lex

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

rir3760

Cita de: DanielC# en  3 Marzo 2015, 17:22 PMalguien me puede decir si esta es una manera correcta de duplicar un archivo
El programa debe funcionar correctamente, solo un detalle: si alguna de las aperturas de archivo falla terminaras llamando a la función fclose con su argumento igual a NULL y eso no lo define el lenguaje (comportamiento no definido).

Para solucionarlo antes de llamar a fclose verifica el valor de su argumento mediante una sentencia condicional:
if (ptrOrigen != NULL)
   fclose (ptrOrigen);
if (ptrCopia != NULL)
   fclose (ptrCopia);


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

#3
Hola.
angel lex, no te respondí porque me pareció que estaba muy claro cuál era mi consulta.-
rir3760, te dejo un programita que arme con datos obtenidos en la web porque me pareció interesante para leer un archivo como el siguiente:

campo1:2:campo3
campo4:5:campo6



#include <stdio.h>

int main(void){
char campoUno[100], campoTres[100];
int campoDos = 0;

FILE *ptrBdd = fopen("datos.txt", "r");
if( ptrBdd == NULL){
printf( "\n\n Error al intentar abrir archivo..." );
}
else{
while( !feof(ptrBdd) ){
fscanf( ptrBdd, "%[a-z0-9]:%d:%[a-z0-9]\n", campoUno, &campoDos, campoTres );
printf( "%s %d %s\n", campoUno, campoDos, campoTres);
}
fclose(ptrBdd);
}


getchar();
return 0;
}


La consulta es. ¿es correcto poner el cierre del archivo dentro del else? ¿ o tengo que cerrarlo con el condicional if?

Saludos.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Cita de: DanielC# en  4 Marzo 2015, 15:30 PM¿es correcto poner el cierre del archivo dentro del while()? ¿ o tengo que cerrarlo con el condicional if?
El programa tal como esta funciona correctamente:
A) Si la apertura del archivo falla no es necesario cerrarlo.
B) Si la apertura del archivo es exitosa este se cierra después del bucle while.

Un detalle es la especificación de rangos en la forma "a-z" ya que estos dependen del compilador utilizado, otro mas es la falta de validaciones mas el uso de feof para controlar el bucle. Para el caso es mejor:
if ( ptrBdd == NULL) {
   perror("datos.txt");
}else {
   while (fscanf(ptrBdd, " %[^:]:%d:%s", campoUno, &campoDos, campoTres) == 3)
      printf( "%s %d %s\n", campoUno, campoDos, campoTres);
   fclose (ptrBdd);
}


Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

DanielPy

Hola a todos.
rir3760 créeme que desde que pusiste tu último post y hasta este momento que son las 23.36 (Argentina) que estuve buscando casi sin cesar que significaba el == 3 que parece tener relación con el bucle while pero no logro encontrar la explicación, ni siquiera el archivo tiene 3 renglones de 3 campo cada uno (tiene 2), ¿me lo podrías aclarar ?.- :huh: :huh: :huh: 

Saludos y gracias por tú tiempo.
Daniel
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor
y cuando lo abrazas dejan de causar dolor.-

rir3760

Las funciones fscanf, scanf y sscanf retornan el numero de conversiones realizadas con éxito. La condición del bucle:
while (fscanf(ptrBdd, " %[^:]:%d:%s", campoUno, &campoDos, campoTres) == 3)
   printf( "%s %d %s\n", campoUno, campoDos, campoTres);
fclose (ptrBdd);

Compara el resultado de fscanf con el valor tres porque este es el numero de conversiones que debe realizar la función al leer cada registro. En otras palabras "Mientras se lean con éxito los tres campos que componen un registro ellos se imprimen en la salida estándar".

Si no tienes una referencia de la biblioteca estándar de C dos (en ingles) que puedes utilizar son:
Plauger C90 Reference
C Plus Plus: scanf

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language