Manipulando ficheros de texto

Iniciado por ProgramError, 21 Octubre 2017, 04:46 AM

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

ProgramError

Hola buenas.

Tengo algunos problemillas a la hora de leer (en C) información de archivos de texto.
Digamos que tendría un archivo con el siguiente formato

/**/
Nombre: aaa
Direccion: bbb
Telefono: ccc
/**/
Nombre: jjj
Dirección: sss
Telefono: aaa
/**/
.
.
.
Y así por ejemplo hasta 6 registros.

Mi pregunta es la siguiente. ¿Cómo podría hacer para leer cada registro de forma eficiente teniendo en cuenta que tengo que hacer un filtrado de los contactos para verificar que el nº de telefono es correcto?

Esto es lo que se me ocurre:

Leer linea a linea y cada una de ellas particionarla con un strtok(linea,:*) y de esta manera poder separar cada palabra. La info la metería en un struct contacto formado por nombre, direccion y telefono. Entonces ya podría verificar el numero de telefono.

Qué otras soluciones se os ocurren o qué funciones me recomendaríais para facilitar el recorrido del fichero.

También me surge otra duda. ¿Es posible que un fichero lo puedas empezar a leer desde la mitad por ejemplo? Es decir, imaginaros que quiero dejar una marca en mitad del fichero para luego volver a abrirlo y empezar a leer desde ahí. ¿Eso es posible?

Un saludo a todos y gracias de ante mano.


ThunderCls

Lo primero que te recomendaría es informarte un poco respecto a las funciones de manejo de ficheros en C

https://fresh2refresh.com/c-programming/c-file-handling/
https://www.tutorialspoint.com/cprogramming/c_file_io.htm
http://www.studytonight.com/c/file-input-output.php


Para leer un fichero primero necesitas conocer la estructura de dicho fichero (como esta dispuesta la información) y luego pues lees cada registro (toda una estructura a la vez) del stream del fichero hasta EOF y no linea a linea. Podrias usar fread/memcpy/fscanf/etc, tienes muchas opciones, solo es cuestión de leer y practicar.
Saludos
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

Serapis

Asumo que el fichero lo has creado tú y por tanto la estructura que sigue depende enteramente de tí.

Si tienes campos fijos, entonces debes crear una estructura:
Estructura Datos
 Nombre
 Direccion
 Telefono
Fin estructura

Ahora entonces es posible leer de una vez una estructura como una única variable.
Cuántas erstrcuturas tienes?. Pués calcula: si el fichero tiene x bytes y cada estructura ocupa y bytes, habrá z estructuras (z=/x/y)
También podrías dejar al comienzo un valor de 4 bytes indicando cuantas estructuras tiene el fichero, no es imprescindible, en cualquier caso, el código vendría ser:


Estructura Dts()
entero = Funcion Leerfichero(ficheroX)
   Estructura Dt
   Entero n, k
   Buleano b
   
   b= AbrirFichero(ficheroX)
   Si b=TRUE luego
       n = ContarEstructuras // sea leyendo un campo del mismo, o del modo señalado)
       Redimensionar array Dts(0 a n-1)
       // x deberá ser el valor que competa al caso.
       PosicionarPunteroDeLectura(x) //al comienzo de la estructuras //si fuere necesario porque antes hubieres saltado a algún otro punto, para leer alguna cosa...
       
       Bucle para k desde 0 hasta n-1
           LeerFichero(dt)
           dts(k) = dt
       Fin bucle
       CerrarFichero
       Devolver n //númeor de estructuras hallados
   Si no
       Devolver -1 //error
   Fin si
Fin funcion


Parte de lo que solicitas ya te respondío el compañero más arriba.

Finalmente solo indicarte que sí, que es posible el "acceso aleatorio" en un fichero. Si está compuesto de registros (estructuras, datos cordinados), es conveniente que se señale el número de registro siguiente a leer, en vez de el puntero donde comenzar, y cuando vayas a continuar leyendo, calcular el posición exacta, multiplicando el número de estructuras,por los bytes que ocupa cada una, más el posible desplazamiento de estructuras únicas que hubiere al comienzo (del fichero) de las estructuras repetidas.
Ese dato, del punto de lectura, no conviene guardarlo en el mismo fichero si no en otro aparte...
Modificando la función anterior, que antes era:

entero = Funcion Leerfichero(ficheroX)

ahora se le añade un parámetro más y quedaría:

entero = Funcion Leerfichero(ficheroX, Registro)
   entero posicion
   ...
  posicion = ((Size(dt) * Registro) + DesplazamientoInicial)
  PosicionarPunteroDeLectura(posicion)
  ...
Fin funcion