Pregunta:
Pasar datos de fichero a struct (C++)?
2008-01-10 09:18:56 UTC
Hola, alguien podria ayudarme en decirme como leer a partir de un fichero de texto (agenda.txt) su contenido y trabajar con ellos. Cómo los agrupo si por ejemplo la agenda es:
NOMBRE / APELLIDOS / TLF / DNI
Juan Martinez Perez 667328403 76483433343D
Maria Lopez Aguilar 738384949 43456733432D

Como podria por ejemplo leer solo los DNI, o los apellidos para ordenarlos?? Creo que metiendolo en estructuras ,no es asi?
Gracias de antemano, cualquier ayuda será mucho para mi.
Tres respuestas:
Fernanda
2008-01-10 10:29:19 UTC
La estructura de datos FILE se encuentra en el fichero de cabecera "stdio.h" para el manejo de ficheros.



Enlace de Ejemplos:



http://dmi.uib.es/~abasolo/foninf/2002-2003/capitulos/6-ficheros.html



Función fopen:

Sintaxis:

FILE *fopen(char *nombre, char *modo);



Esta función sirve para abrir y crear ficheros en disco. El valor de retorno es un puntero a una estructura FILE. Los

parámetros de entrada son:

1. nombre: una cadena que contiene un nombre de fichero válido, esto depende del sistema operativo que

estemos usando. El nombre puede incluir el camino completo.

2. modo: especifica en tipo de fichero que se abrirá o se creará y el tipo de datos que puede contener, de texto

o binarios:

m r: sólo lectura. El fichero debe existir.

m w: se abre para escritura, se crea un fichero nuevo o se sobreescribe si ya existe.

m a: añadir, se abre para escritura, el cursor se situa al final del fichero. Si el fichero no existe, se crea.

m r+: lectura y escritura. El fichero debe existir.

m w+: lectura y escritura, se crea un fichero nuevo o se sobreescribe si ya existe.

m a+: añadir, lectura y escritura, el cursor se situa al final del fichero. Si el fichero no existe, se crea.

m t: tipo texto, si no se especifica "t" ni "b", se asume por defecto que es "t"

m b: tipo binario.



Función fclose:

int fclose(FILE *fichero);

Es importante cerrar los ficheros abiertos antes de abandonar la aplicación. Esta función sirve para eso. Cerrar un

fichero almacena los datos que aún están en el buffer de memoria, y actualiza algunos datos de la cabecera del

fichero que mantiene el sistema operativo. Además permite que otros programas puedan abrir el fichero para su

uso. Muy a menudo, los ficheros no pueden ser compartidos por varios programas.

Un valor de retorno cero indica que el fichero ha sido correctamente cerrado, si ha habido algún error, el valor de

retorno es la constante EOF. El parámetro es un puntero a la estructura FILE del fichero que queremos cerrar.



Función fgetc:

Sintaxis:

int fgetc(FILE *fichero);

Esta función lee un carácter desde un fichero.

El valor de retorno es el carácter leído como un unsigned char convertido a int. Si no hay ningún carácter

disponible, el valor de retorno es EOF. El parámetro es un puntero a una estructura FILE del fichero del que se

hará la lectura.



Función fputc:

Sintaxis:

int fputc(int caracter, FILE *fichero);

Esta función escribe un carácter a un fichero.

El valor de retorno es el carácter escrito, si la operación fue completada con éxito, en caso contrario será EOF.

Los parámetros de entrada son el carácter a escribir, convertido a int y un puntero a una estructura FILE del

fichero en el que se hará la escritura.



Función feof:

Sintaxis:

int feof(FILE *fichero);

Esta función sirve para comprobar si se ha alcanzado el final del fichero. Muy frecuentemente deberemos trabajar

con todos los valores almacenados en un archivo de forma secuencial, la forma que suelen tener los bucles para

leer todos los datos de un archivo es permanecer leyendo mientras no se detecte el fin de fichero. Esta función

suele usarse como prueba para verificar si se ha alcanzado o no ese punto.

El valor de retorno es distinto de cero sólo si no se ha alcanzado el fin de fichero. El parámetro es un puntero a la

estructura FILE del fichero que queremos verificar.



Función rewind:

Sintaxis:

void rewind(FILE *fichero)

Sitúa el cursor de lectura/escritura al principio del archivo.



Ejemplos:



#include

int main()

{

FILE *fichero;

fichero = fopen("ejemplo1.c", "r");

while(!feof(fichero)) fputc(fgetc(fichero), stdout);

rewind(fichero);

while(!feof(fichero)) fputc(fgetc(fichero), stdout);

fclose(fichero);

getchar();

return 0;

}



Función fgets:

Sintaxis:

char *fgets(char *cadena, int n, FILE *fichero);

Esta función está diseñada para leer cadenas de caracteres. Leerá hasta n-1 caracteres o hasta que lea un retorno de

línea. En este último caso, el carácter de retorno de línea también es leído.

El parámetro n nos permite limitar la lectura para evitar derbordar el espacio disponible en la cadena.

El valor de retorno es un puntero a la cadena leída, si se leyó con éxito, y es NULL si se detecta el final del

fichero o si hay un error. Los parámetros son: la cadena a leer, el número de caracteres máximo a leer y un

puntero a una estructura FILE del fichero del que se leerá.



Función fputs:

Sintaxis:

int fputs(const char *cadena, FILE *stream);

La función fputs escribe una cadena en un fichero. No se añade el carácter de retorno de línea ni el carácter nulo

final.

El valor de retorno es un número no negativo o EOF en caso de error. Los parámetros de entrada son la cadena a

escribir y un puntero a la estructura FILE del fichero donde se realizará la escritura.



Función fread:

Sintaxis:

size_t fread(void *puntero, size_t tamaño, size_t nregistros, FILE*fichero);

Esta función está pensada para trabajar con registros de longitud constante. Es capaz de leer desde un fichero uno

o varios registros de la misma longitud y a partir de una dirección de memoria determinada. El usuario es

responsable de asegurarse de que hay espacio suficiente para contener la información leída.

El valor de retorno es el número de registros leídos, no el número de bytes. Los parámetros son: un puntero a la

zona de memoria donde se almacenarán los datos leídos, el tamaño de cada registro, el número de registros a leer

y un puntero a la estructura FILE del fichero del que se hará la lectura.



Te mando un enlace con un manual:



http://www.tecnun.es/asignaturas/funprogra/Apuntes/Ficheros.pdf



http://www.conclase.net/c/curso/index.php



Suerte!!



Profesora MFV
Dark Dragon
2008-01-10 19:12:51 UTC
Hola

Bueno por si mismo el programa no sabe cual es un nombre o cual es un apellido ya que una persona puede tener mas de un nombre como por ejemplo "Luis Fernando Estrada Lopez" o puede solo ingresar un solo nombre y un solo apellido hay muchas combinaciones y depende de el pregrama que tan complejo y capáz sea de detectar estas diferencias ya que de que se puede se puede pero necesitarias una base de datos con nombres para comparar y repartirlo correctamente, ahora lo que recomendaria ampliamente es que en el archivo de texto pongas limitadores para decirle al programa cuando es un nombre y cuando un apellido cuando es el DNI el tel etc:



en ves de solo poner esto

Juan Martinez Perez 667328403 76483433343D

Maria Lopez Aguilar 738384949 43456733432D



agregale un delimitador

Juan | Martinez Perez | 667328403 | 76483433343D |

Maria | Lopez Aguilar | 738384949 | 43456733432D |



esto hace que el programa sea mucho mas simple y mas eficaz tu podrias hacer otro programa en donde escriba en el archivo de texto y lo delimite automaticamente y creeme te va a servir de mucho



te voy a poner el codigo en donde lee el archivo y separa los datos y los coloca en un array



/*estos son los includes necesarios*/

#include

#include



/*para un acceso rapido damos este espacio de nombres*/

using namespace std;



/*esta es la funcion acomodala como necesites*/

void f()

{



/*contador nos va a dar el caracter que se va a leer y repartir es quien nos dice si es nombre telefono apellido etc.*/

long contador = 0;

short repartir = 1;



/*cadena es en donde va a estar almacenado el archivo y fichero es el puntero al archivo a usar*/

string cadena;

FILE *fichero;



/*declaramos los arrays para guardar y claificar los datos y 50 es el numero de registros que quieres guardar agregale o quitale segun necesites*/

string Nombre[50]; //1

string Apellido[50]; //2

string Telefono[50]; //3

string DNI[50]; //4



/* lugar es la posicion que va a ocupar los nombres en el registro por ejemplo en el lugar 0 esta juan peres etc. en el lugar 1 esta pedro sanches etc. en el 2 esta paulina flores etc.*/

short lugar = 0;



*/ fopen_s() es una forma segura y optimizada de leer datos pero si no la tienes puede usar fopen()

La direccion se escribe con doble \\ porque si pones solo una \ el compilador va a tomar el caacter derecho como codigo ejecutable y asi lo evitamos

rt es como se va a usar el archio rt significa ReadText existe w-write b-binary etc...*/

fopen_s(&fichero,"C:\\carpeta\\rutadelarchivo\\carpeta\\archivo.txt", "rt");



/*enviamos el contenido del archivo al array caracter por caracter hasta que encuentre el fin del archivo que es detectado por feof()*/

while(!feof(fichero)) cadena += fgetc(fichero);

fclose(fichero);



/*este procedimiento reparte todo en su lugar respectivo con las notas anteriores supongo que le entenderias solo cabe destacar las comparaciones con los numeros -1, 59 y 124.

todos son caracteres ascii

-1 es para indicar un fin del archivo

124 es la barra vertical en ascii es |

59 es ;

*/

while ( cadena[contador] != -1 )

{

if( cadena[contador] == 59 )

{

repartir = 1;

++lugar;

}

else if ( cadena[contador] != 124 )

{

switch ( repartir )

{

case 1:

Nombre[lugar] += cadena[contador];

break;

case 2:

Apellido[lugar] += cadena[contador];

break;

case 3:

Telefono[lugar] += cadena[contador];

break;

case 4:

DNI[lugar] += cadena[contador];

}



}

else

{

++repartir;

}

}

}



/*



el archivo de texto tiene:



Juan | Martinez Perez | 667328403 76483433343D ;

Maria | Lopez Aguilar | 738384949 43456733432D ;

etc...



espero sepas usar el codigo anterior cualquier duda me mandas un mensajillo



SALUDOS!!! fin jeje*/
☆яคυl☆®
2008-01-10 17:25:46 UTC
Hola amiga me gusta lo que haces espero que esto te sirva sigue a delante y que nada te detenga tu amigo luar.


Este contenido se publicó originalmente en Y! Answers, un sitio web de preguntas y respuestas que se cerró en 2021.
Loading...