elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Archivos en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Archivos en C  (Leído 2,940 veces)
NoBass

Desconectado Desconectado

Mensajes: 2



Ver Perfil
Archivos en C
« en: 26 Agosto 2016, 02:52 am »

Hola, hace unos pocos meses que he empezado a curiosear por el  bonito mundo de la programación. Soy nuevo en el foro y por ahora no puedo aportar mas que dudas, espero que en un futuro no muy lejano pueda ser de ayuda a los que se encuentren en mi actual situación.

Dicho ésto, al lío:

Llevo días buscando y recopilando información acerca de cómo trabajar con archivos en lenguaje C. He encontrado bastante información a nivel básico acerca de:

-Lectura i escritura
-El variado elenco de funciones dedicadas a tales fines
 
Por ejemplo aquí:
https://kesquivel.files.wordpress.com/2013/08/ficheros2013.pdf
http://www.cs.buap.mx/~mrodriguez/MIS%20FRAMES/Files2.pdf
http://www.c.conclase.net/ficheros/?cap=002

He leído todo ésto con cariño y paciencia, pero muy a mi pesar, no he encontrado toda la información que deseo.

Entiendo que mis dudas, que ahora expongo, son de collejón, así que gracias por la paciencia de antemano.

1.-Si leo un archivo en binario (por ejemplo un pdf) y lo copio a otro archivo, que guardo como pdf, el documento resulta ilegible. Entiendo que ésto es porque el archivo original tiene un formato determinado, que al copiar bit a bit no se mantiene o que hay que interpretar de algún modo. Imagino la copia (bueno de hecho así la veo cuando la abro con el editor de texto) como una montaña absurda de caracteres descabellados que hay que organizar de algún modo, pero intuyo que es algo bastante complejo.

2.-Entonces ¿cómo se copia en C un archivo, manteniendo las características del mismo? Es decir: ¿Cómo se reproduce el clásico ctrl+c desde un programa escrito en C?

Lo que me gustaría es encontrar información acerca de éste y procesos similares, es decir, algo mas general acerca de cómo se construyen, organizan, leen e interpretan archivos de todo tipo.

Muchísimas gracias y saludos para todos.

NoBass
No groove


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Archivos en C
« Respuesta #1 en: 26 Agosto 2016, 04:59 am »

1.-Si leo un archivo en binario (por ejemplo un pdf) y lo copio a otro archivo, que guardo como pdf, el documento resulta ilegible. Entiendo que ésto es porque el archivo original tiene un formato determinado, que al copiar bit a bit no se mantiene o que hay que interpretar de algún modo. Imagino la copia (bueno de hecho así la veo cuando la abro con el editor de texto) como una montaña absurda de caracteres descabellados que hay que organizar de algún modo, pero intuyo que es algo bastante complejo.

Eso es rotundamente falso. Si abres un archivo en binario, copias byte a byte y lo guardas en otro archivo con la misma extensión, debería ser una copia exacta, y como tal, no debería haber problemas con la copia. Te dejo un código que copia exactamente un archivo a otro:

Código
  1. #include <string.h>
  2. #include <stdio.h>
  3.  
  4. #define MAX_PATH 4096
  5.  
  6. int main() {
  7. // Puedes poner MAX_PATH como quieras, o saber este valor a través de librerías
  8. // no estándares
  9. char ruta_entrada[MAX_PATH];
  10. char ruta_salida[MAX_PATH];
  11. FILE *entrada;
  12. FILE *salida;
  13. char byte;
  14. int salir = 0;
  15.  
  16. // Obtenemos rutas
  17. fprintf(stdout, "Introduzca la ruta del archivo a copiar: ");
  18. fgets(ruta_entrada, MAX_PATH, stdin);
  19. ruta_entrada[strlen(ruta_entrada) - 1] = '\0';
  20. fprintf(stdout, "Introduzca la ruta del archivo de destino: ");
  21. fgets(ruta_salida, MAX_PATH, stdin);
  22. ruta_salida[strlen(ruta_salida) - 1] = '\0';
  23.  
  24. // Abrimos archivos
  25. entrada = fopen(ruta_entrada, "rb");
  26. if(NULL == entrada) {
  27. fprintf(stderr, "Error abriendo archivo de entrada en '%s'\n", ruta_entrada);
  28. perror("Detalles");
  29. return -1;
  30. }
  31.  
  32. salida = fopen(ruta_salida, "wb");
  33. if(NULL == salida) {
  34. fprintf(stderr, "Error abriendo archivo de salida en '%s'\n", ruta_salida);
  35. perror("Detalles");
  36. return -1;
  37. }
  38.  
  39. // Copiando datos
  40. while(0 == salir) {
  41. byte = fgetc(entrada);
  42.  
  43. if(0 == feof(entrada)) {
  44. fputc(byte, salida);
  45.  
  46. if(0 != ferror(entrada) || 0 != ferror(salida)) {
  47. fprintf(stderr, "Error leyendo|escribiendo byte\n");
  48. perror("Detalles");
  49. return -1;
  50. }
  51. } else {
  52. salir = 1;
  53. }
  54. }
  55.  
  56. // Terminando...
  57. fprintf(stdout, "La copia de archivos ha finalizado\n");
  58.  
  59. fclose(entrada);
  60. fclose(salida);
  61. return 0;
  62. }

Evidentemente, esto no es lo más básico, sino que es una forma "muy segura" de copiar archivos (se podrían haber omitido la comprobación de que los archivos existen, los mensajes de error...)

Espero que te sea de ayuda.

PD.: Probé el código con un PDF, y funcionó perfectamente :D


En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: Archivos en C
« Respuesta #2 en: 26 Agosto 2016, 08:29 am »

¡Buenas!

No se si lo estarás haciendo así o no, sin ver tu código es imposible saberlo, pero si utilizas feof para saber si has llegado al final del archivo tienes que tener en cuenta dos cosas.

- El indicador de final de archivo se activa después de realizar una lectura cuando ya no quedan más datos por leer: lees el último dato-> haces la siguiente lectura -> se activa el indicador de fin de archivo (y por lo tanto en la última lectura no has obtenido ningún dato útil y si escribes éste último dato estarás escribiendo información que no debería de estar ahí)

- Los archivos que no contienen solo texto (caracteres alfanuméricos, espacios, signos de puntuación y poco más), pueden dar lecturas falsas de final de archivo antes de haber llegado a éste. Así que lo mejor es utilizar las funciones fseek y ftell para para posicionarte al final del archivo, leer la cantidad de bytes que contiene y volver a la posición en la que estaba. Sabiendo la cantidad exacta de bytes que tienes que leer no te hace falta depender del indicador de final de archivo.

¡Saludos!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: Archivos en C
« Respuesta #3 en: 26 Agosto 2016, 09:30 am »

Lo primero si que lo tuve en cuenta en el código. Lo segundo, pues no :P
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
NoBass

Desconectado Desconectado

Mensajes: 2



Ver Perfil
Re: Archivos en C
« Respuesta #4 en: 26 Agosto 2016, 10:01 am »

Citar
Eso es rotundamente falso. Si abres un archivo en binario, copias byte a byte y lo guardas en otro archivo con la misma extensión, debería ser una copia exacta, y como tal, no debería haber problemas con la copia.

Pues me alegro muchísimo, porque había llegado a una conclusión aterradora. Gracias por escribir el código, se entiende muy bien.

Citar
No se si lo estarás haciendo así o no, sin ver tu código es imposible saberlo, pero si utilizas feof para saber si has llegado al final del archivo tienes que tener en cuenta dos cosas.

Soy tan listo que después de unas pruebas borré por error el código -lamentable- que había escrito, pero intuyo que el error tendría que ver con lo que sugieres o quizás con el uso de funciones dispares para leer y escribir, puesto que por lo demás se parecía (bueno, de lejos y sin gafas) al que había escrito class_OpenGL.

Gracias por vuestra ayuda.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines