Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: cgvwzq en 6 Mayo 2010, 21:44 pm



Título: Duda fopen() y modos de apertura
Publicado por: cgvwzq en 6 Mayo 2010, 21:44 pm
Pues estoy haciendo algo con ficheros y tengo un pequeño problema. Necesito abrir un fichero secuencial para escritura/lectura  y poder escribir, leer o modificar un registro en una posición X. Para ello uso fseek() y situo el cursor en la posición que me interesa.

Código
  1. fd = fopen(nombre,a+b);

El fseek funciona perfectamente, y puedo leer cualquier posición, pero cuando se escribe se va al fin de fichero...

Citar
"a+" | Open a file for reading and appending. All writing operations are performed at the end of the file, protecting the previous content to be overwritten. You can reposition (fseek, rewind) the internal pointer to anywhere in the file for reading, but writing operations will move it back to the end of file. The file is created if it does not exist.

¿Hay alguna forma de evitar eso, o debo estar cambiando de modo manualmente cada vez que quiera hacer una operación?  :-\

Saludos!


Título: Re: Duda fopen() y modos de apertura
Publicado por: AckeR en 6 Mayo 2010, 22:11 pm
Hola

Hay varios Modos apertura que te pueden servir.

Los modos de apertura válidos son:

    * Modo "r": Abre el archivo existente para lectura en modo secuencial. El archivo debe existir previamente.
    * Modo "w": Crea un archivo nuevo para escritura en modo secuencial,pero cuidado si el archivo ya existe, se borrará y se creará uno nuevo.
    * Modo "a": Abre un archivo existente para escritura en modo secuencial, añadiendo los datos al final de los que haya. Si el archivo no existe, se crea.
    * Modo "r+": Abre el archivo para lectura/escritura en modo directo. El archivo debe existir previamente. Se puede leer y escribir en cualquier posición del archivo.
    * Modo "w+": Crea un archivo para lectura/escritura en modo directo. Si el archivo ya existe, se elimina y se crea de nuevo. Se puede leer y escribir en cualquier posición del archivo.
    * Modo "a+": Abre un archivo existente para lectura/escritura en modo directo. Si el archivo no existe, lo crea. La escritura sólo se podrá realizar al final del archivo (modo "añadir"), aunque se puede leer en cualquier posición.


Título: Re: Duda fopen() y modos de apertura
Publicado por: cgvwzq en 6 Mayo 2010, 22:19 pm
Sí, eso lo conozco... Y lo que me hace falta en verdad es "rb+", pero necesito comprobar si el archivo existe por adelantado... ¿Hay alguna función estándard para ello? Sino en caso de error le doy "wb+", aunque si falla por alguna otra cosa lo trunco y se lia... :S


Título: Re: Duda fopen() y modos de apertura
Publicado por: AckeR en 6 Mayo 2010, 23:31 pm
Para poder ver si existe el archivo o no .

Código
  1. int main()
  2. {
  3.  
  4. FILE* archivo;
  5. archivo = fopen("nombredetuarchivo.txt","r+");
  6.  
  7. if (archivo == NULL)
  8. {
  9.  printf("Error al abrir el archivo");
  10.  return -1;
  11. }
  12.  
  13. else
  14. {
  15.  // (condición)
  16. }
  17.  
  18. return 0;
  19. }
  20.  
  21.  




Título: Re: Duda fopen() y modos de apertura
Publicado por: cgvwzq en 6 Mayo 2010, 23:45 pm
Gracias AckeR, a eso me referia... Pero puede dar error por otras razones, a parte de porque no exista el archivo, y si lo trunco estando lleno liada parda.


Título: Re: Duda fopen() y modos de apertura
Publicado por: Akai en 6 Mayo 2010, 23:53 pm
Sugerencia: y si pruebas primero a abrirlo con r unicamente para comprobar que existe y en caso de existir lo cierras y abres ya con el modo que te interesa?


Título: Re: Duda fopen() y modos de apertura
Publicado por: AckeR en 6 Mayo 2010, 23:58 pm
umh mira:

Si fopen(), por la razón que sea, no puede abrir el archivo, devolverá un puntero a NULL.

entonces esto te asegura si el archivo existe o no , otra cosa el archivo tiene que estar ubicada donde tengas tu programa, o bien tu al momento de abrir el archivo , darle la ubicacion de este mismo.

Suerte!


Título: Re: Duda fopen() y modos de apertura
Publicado por: cgvwzq en 7 Mayo 2010, 00:17 am
No me he explicado bien: que fopen() devuelva NULL no implica que el fichero no exista... Puede ser que no tengamos permisos, que la tabla de fds este llena, o a saber...

Y sí, podría hacer algo así:

Código
  1. fd = fopen(nombre,"rb+");
  2. if (fd == NULL) {
  3.   fd = fopen(nombre,"a");
  4.   fclose(fd);
  5.   fd=fopen(nombre,"rb+");
  6. }
  7.  

Pero me parece una chapuza... : /


Título: Re: Duda fopen() y modos de apertura
Publicado por: Littlehorse en 7 Mayo 2010, 00:25 am
Es imposible comprobar unicamente la existencia de un archivo en forma estándar. O bien usas métodos específicos del sistema o utilizas alguna librería multiplataforma.

Ademas, que el archivo no exista tampoco implica que tengas permisos para crearlo o que otro proceso no este a punto de crearlo también.

Saludos