Duda fopen() y modos de apertura

Iniciado por cgvwzq, 6 Mayo 2010, 21:44 PM

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

cgvwzq

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.

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!
Some stuff:

  • www.a] parsed as www.a]
  • Bypass elhacker's img filter with ALT attribute!
  • ¿Para cuándo SQLi I y II? WZ



AckeR

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.

...DaR LaS GraCiaS No CuestA NadA...

cgvwzq

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
Some stuff:

  • www.a] parsed as www.a]
  • Bypass elhacker's img filter with ALT attribute!
  • ¿Para cuándo SQLi I y II? WZ



AckeR

Para poder ver si existe el archivo o no .


int main()
{

FILE* archivo;
archivo = fopen("nombredetuarchivo.txt","r+");

if (archivo == NULL)
{
  printf("Error al abrir el archivo");
  return -1;
}

else
{
  // (condición)
}

return 0;
}





...DaR LaS GraCiaS No CuestA NadA...

cgvwzq

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.
Some stuff:

  • www.a] parsed as www.a]
  • Bypass elhacker's img filter with ALT attribute!
  • ¿Para cuándo SQLi I y II? WZ



Akai

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?

AckeR

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!

...DaR LaS GraCiaS No CuestA NadA...

cgvwzq

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í:


fd = fopen(nombre,"rb+");
if (fd == NULL) {
   fd = fopen(nombre,"a");
   fclose(fd);
   fd=fopen(nombre,"rb+");
}


Pero me parece una chapuza... : /
Some stuff:

  • www.a] parsed as www.a]
  • Bypass elhacker's img filter with ALT attribute!
  • ¿Para cuándo SQLi I y II? WZ



Littlehorse

#8
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
An expert is a man who has made all the mistakes which can be made, in a very narrow field.