Ayuda los modos de apertura de archivos en C.

Iniciado por theluigy13etv, 21 Diciembre 2011, 03:38 AM

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

theluigy13etv

Por más que leo miles de libros, tutoriales, videos en internet, no puedo entender del todo los modos de aperturas de archivos en C. Siempre llego a contradicciones o círculos viciosos. Aquí les pongo mis conclusiones al respecto, espero que me corrijan si estoy equivocado en algo.


Lo que quiero hacer es específicamente lo siguiente. Necesito hacer un programa que me permita almacenar en un archivo binario (trabajarlo siempre en modo secuencial), una lista de alumnos. Pero no una sola vez. Sino cada vez que abra el programa me permita, como simular la matrícula de uno, dos, tres, n..., alumnos (según lo que se necesite) de tal forma, que cada alumno tiene un código único. Si es que intento matricular un alumno con un código que ya ha sido registrado o matriculado anteriormente (osea que ya está guardado en el archivo). entonces el programa no me lo permita.

Bueno para eso, razono más o menos así. Primero, ingreso el código del nuevo alumno a matricular y lo almaceno en una variable auxiliar. Seguidamente abro el archivo en modo lectura  "rb" y empiezo a recorrer el archivo desde el principio hasta el final while!(feof(arch))  y ver si es que ya existe un código similar al q quiero agregar. SI es que no lo hay, cierro el archivo y lo vuelvo a abrir en el modo añadidura  "ab" para escribir añadir ese nuevo alumno al final de mi archivo.

Bueno, utilizando ambos modos, creo que me fue bien. Pero mi profesor utiliza el modo "a+b" para hacerlo sin necesidad de usar los dos modos anteriores que yo usé.

Según la teoría dice lo siguiente respecto al modo "a+b": " Abre el archivo para modificar (escribir/leer) al final. Si no existe el archivo, funciona igual que w+"
Duda: ¿Si es que me sitúa al final. Qué sentido tiene leer al final?, si al final no hay nada¿¿¿??..para leer tengo que estar al inicio??? Si tiene sentido escribir al final, pero leer al final???

Bueno, lo que hice fue intentar con este modo "a+b" y como arte de magia me funciona sin necesidad de usar "rb" y "wb". Pero , usando este modo, como que me mareo y no entiendo lo que ocurre con el archivo. Osea, funciona, pero no entiendo como funciona. Porque pareciera que con este modo "a+b", cuando leo, la lectura lo hace desde el el inicio al final y cuando escribio, la escritura lo hace al final sin sobreescribir datos almacenados en el archivo, como que funciona inteligentemente. Estoy en una gran duda. Ayudaaaaaaaaaaaaaa :o


Ojo, no pido que me resuelvan el programa, sino que me orienten sobre como funciona el modo de apertura "a+b" bajo cualquier circunstancia. Existe archivo, no existe, tiene elementos, no tiene. Porque la teoría que encontré en todas mis búsquedas no explican ampliamente estos modos.

Y para que vean que es verdad lo que les digo, que si he buscado información la respecto, aquí mis conclusiones sobre los modos que si he llegado a entender:

* MODO rb

Con este modo permite leer todos los elementos del archivo porque al abrirse siempre se va a

situar en el primer elemento. Si no existiera el archivo me devuelve NULL y el archivo ni se crea ni

se abre.

* MODO wb

CHANCAR, ESCRIBIR DESDE EL INICIO. Con este modo me permite escribir datos en el archivo,

mediante fwrite. Cada fwrite escribe en una posicion consecutiva a la anterior. Si ya había

anteriormente un archivo, estos son sobreescritos. Sino existe el archivo, este es creado y dejado

abierto listo para llenarlo.

* Modo ab

AÑADIR AL FINAL, NO LEER. Si no existe el archivo, entocnes lo crea y lo abre y permite escribir

datos desde el comienzo. Si es que ya existe el archivo y tiene elementos, Permite escribir datos

a partir del final, es decir, permite añadir. CONCLUSIÓN: Siempre que quiero añadir datos en un

archivo, exista o no este sin temor a perder datos si ya existiese, se usa ab. Siempre añadirá

datos la final  y si no hubiera datos, los añade desde el principio. (IDÓNEO PARA AÑADIR AL

FINAL, no leer)

* Utilizando rb y ab

Con rb, recorro el archivo (DE INICIO A FIN) para ver si algún elemento del archivo tiene el mismo

codigo que el nunevo elemento qeu quiero guardar. Si es que ya existe una rchivo con el mismo

elemento, entonces no lo añado y me salgo con "return".

Si luego de recorrer todo el archivo, veo que no hay repeticion entre un elemento guardado y el

nuevo que quieor añadir, entonces cierro el archivo dle modo lectura y lo abro en el modo ab

para añadir el nuevo dato al final y así esté guardado consecutivamente al anterior.



Y para el modo "a+b" también me hice una conclusión, pero no estoy seguro sí es la correcta, porque me funciona de una manera que como que no encaja con la teoría...Aquí mi conclusión (espero cualquier correción al respecto)

* Modo a+b

La teoría dice:
"Si el archivo no existe, permite crearlo. EL cabezal de lectura/escritura se sitúa al final de

fichero".
"Abre el archivo para modificar. (Escribir y leer) al final. Si no existe el archivo, funciona con w+"
Pero según lo que He practicado. Funciona como una mezcla de rb y ab. Osea que me permite

leer el archivo desde un principio y permite añadir datos al final (o desde un inicio si está vacío).

Idóneo para llenar una archivo con elementos únicos, por ejemplo, que cada elemento tenga un código o un número que lo identifique único como número de identificación, etc.





naderST

No sabía que era valido usar a+b, pero bueno en fin lo que pasa que el modo a+ no es que se posiciona al final al abrir el archivo, sino que al momento de hacer cualquier operación de escritura este se sitúa al final, pero al momento de la apertura el está posicionado al inicio del archivo.

Si lees bien la teoría:

"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 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.

theluigy13etv

Si pues....el profe manipula archivos secuenciales incluso usando el modo de apertura "a+". Eso me parecía raro en incorrecto, porque siendo estrictos, para archivos secuenciales se utiliza: "r", "w", "a" y para archivos de acceso directo: "r+", "w+", "a+".

Según lo que me dices, concluyo que con "a+" al abrir el archivo se sitúa al inicio. Si leo, lo hará desde el inicio, pero si escribo al hará al final. Ahora, el problema creo que surgiría si es que luego de una escritura (al final), se me ocurre leer.. donde se sitúa el cabezal de lectura?¿ Vuelve al inicio, o se sitúa en el elemento posterior a la escritura realizada anteriormente.

theluigy13etv

Aunque, creo que este modo no causaría problemas si es que lo usamos netamente en archivos de acceso directo... Que ganas del profe de complicarnos la vida!!!

naderST

Al escribir se sitúa al final y cuando vayas a leer estarás en el final. Este tipo de dudas las puedes resolver con tu buen amigo el compilador  :xD. Bueno pero si es con archivos de acceso directo te olvidas de este problema.

theluigy13etv

AYUDA NUEVAMENTEEEEEEEEE!!!!

E estado leyendo el Libro Aprendiendo C en 21 días y en el modo de apertura de archivos encontré lo siguiente

"r+" : Abre el archivo para lectura y escritura. Si el archivo del nombre especificado no existe, es creado. Si el archivo existe se añaden nuevos datos al inicio del archivo, sobreescribiendo los datos existentes.

DUDA: mmm Osea que si el archivo no existe, cuando intento abrir el archivo con fopen("nombre","r+b"), se crea de todas manera un archivo y el sistema operativo me devuelve el puntero a una estructura tipo FILE para poder manipular el archivo.. Pero intenté hacer esto, y me di cuenta que no es así, que no puede abrir un archivo si no existe. [/font]

En el libro de Como programar en C de Deithel:

"r+" Abrir un archivo para actualizar (Leer y escribir).. ¿En dónde?

"w+" Crea un archivo para actulizar. Si el archivo ya existe, se descarta el contenido actual Esto no es actualizar, esto es borrar y comenzar de nuevo

"a+" Agregar, abrir o crear un archivo para actualizar, la escritura se efectúa al final del archivo.

¿Cuál de los modos me recomiendan cuando quiero modificar el nombre de una persona, que se encuentra dentro de una lista de nombres en un archivo, si es que no conozco su posición en el archivo, si solo conozco su código?

Sagrini

Easy. Si abres un fichero con "r" y escribes, te da segmentation fault.