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