Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: DanielPy en 3 Marzo 2015, 17:22 pm



Título: Duplicar un archivo de texto plano con lenguaje C.
Publicado por: DanielPy en 3 Marzo 2015, 17:22 pm
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 ?.- 

Código
  1. /* Programa para copiar un archivo en otro*/
  2. #include <stdio.h>
  3.  
  4. int main(){
  5. char temp[100];
  6. FILE *ptrOrigen = fopen( "cliente.txt", "r");
  7. FILE *ptrCopia  = fopen( "clienteCopia", "w");
  8.  
  9. if( ptrOrigen == NULL || ptrCopia == NULL ){
  10. printf(" \n\n Error al abrir ficheros... ");
  11. }
  12. else{
  13. printf( "\n Se muestra el archivo copiado...\n\n" );
  14. while( fgets( temp, 100, ptrOrigen) ){
  15. fputs( temp, ptrCopia );
  16. printf( " %s", temp );
  17. }
  18. }
  19.  
  20. fclose(ptrOrigen);
  21. fclose(ptrCopia);
  22.  
  23. return 0;
  24. }
  25.  

Desde ya muchas gracias por la ayuda que deseen brindarme.-
Saludos.
Daniel


Título: Re: Duplicar un archivo de texto plano con lenguaje C.
Publicado por: engel lex en 3 Marzo 2015, 17:36 pm
cual error te da?


Título: Re: Duplicar un archivo de texto plano con lenguaje C.
Publicado por: rir3760 en 4 Marzo 2015, 03:00 am
alguien 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:
Código
  1. if (ptrOrigen != NULL)
  2.   fclose (ptrOrigen);
  3. if (ptrCopia != NULL)
  4.   fclose (ptrCopia);

Un saludo


Título: Re: Duplicar un archivo de texto plano con lenguaje C.
Publicado por: DanielPy en 4 Marzo 2015, 15:30 pm
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


Código
  1. #include <stdio.h>
  2.  
  3. int main(void){
  4. char campoUno[100], campoTres[100];
  5. int campoDos = 0;
  6.  
  7. FILE *ptrBdd = fopen("datos.txt", "r");
  8. if( ptrBdd == NULL){
  9. printf( "\n\n Error al intentar abrir archivo..." );
  10. }
  11. else{
  12. while( !feof(ptrBdd) ){
  13. fscanf( ptrBdd, "%[a-z0-9]:%d:%[a-z0-9]\n", campoUno, &campoDos, campoTres );
  14. printf( "%s %d %s\n", campoUno, campoDos, campoTres);
  15. }
  16. fclose(ptrBdd);
  17. }
  18.  
  19.  
  20. return 0;
  21. }
  22.  

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

Saludos.
Daniel


Título: Re: Duplicar un archivo de texto plano con lenguaje C.
Publicado por: rir3760 en 4 Marzo 2015, 16:41 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:
Código
  1. if ( ptrBdd == NULL) {
  2.   perror("datos.txt");
  3. }else {
  4.   while (fscanf(ptrBdd, " %[^:]:%d:%s", campoUno, &campoDos, campoTres) == 3)
  5.      printf( "%s %d %s\n", campoUno, campoDos, campoTres);
  6.   fclose (ptrBdd);
  7. }

Un saludo


Título: Re: Duplicar un archivo de texto plano con lenguaje C.
Publicado por: DanielPy en 5 Marzo 2015, 03:44 am
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


Título: Re: Duplicar un archivo de texto plano con lenguaje C.
Publicado por: rir3760 en 5 Marzo 2015, 15:27 pm
Las funciones fscanf, scanf y sscanf retornan el numero de conversiones realizadas con éxito. La condición del bucle:
Código
  1. while (fscanf(ptrBdd, " %[^:]:%d:%s", campoUno, &campoDos, campoTres) == 3)
  2.   printf( "%s %d %s\n", campoUno, campoDos, campoTres);
  3. 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 (http://web.archive.org/web/20060901132341/http://www-ccs.ucsd.edu/c/stdio.html#scanf)
C Plus Plus: scanf (http://www.cplusplus.com/reference/cstdio/scanf/)

Un saludo