Autor
Tema: LLenar arreglo con un archivo txt (Leído 14,605 veces)
Angel774
Desconectado
Mensajes: 12
Hola!! Lo que pasa es que tengo que hacer un agenda en c++ que lea un archivo de texto y lo cargue en un arreglo de tipo contacto, una vez que se cargo tengo que trabajar en el arreglo con las operaciones de: agregar contacto, buscar, eliminar, mostrar todo, y modificar una vez hecho esto sobrescribir el txt con la nueva información
Este es el codigo que llevo #include <iostream> #include <stdio.h> #include <string.h> using namespace std; struct contacto { char nombre[30]; char direccion[30]; int numero; void pedirdatos(); void mostrardatos(); }; class agenda { private: contacto lista[60]; int cont; public: agenda(); void agregar_contacto(); void buscar_contacto(); void eliminar_contacto(); void modificar_contacto(); void mostrar_contacto(); void guardar_contacto(); }; agenda::agenda() { FILE *arch; cont=0; arch=fopen("agenda.txt","r"); while(!feof(arch)) { fscanf(arch,"%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 ]",lista); fgetc(arch); cont++; } cout<<"contador vale:"<<cont; fclose(arch); } void contacto::mostrardatos() { cout<<"Nombre:"; cout<<nombre<<endl; cout<<"Direccion:"; cout<<direccion<<endl; cout<<"Numero:"; cout<<numero; cout<<endl; } void contacto::pedirdatos() { cout<<"Introduce nombre:"; cin>>nombre; cout<<"Direccion:"; cin>>direccion; cout<<"Telefono:"; cin>>numero; } void agenda::mostrar_contacto() { for(int i=0;i<cont;i++) { lista[i].mostrardatos(); } } void agenda::guardar_contacto() { FILE *arch; arch=fopen("agenda.txt","r"); fclose(arch); } int main() { agenda x; x.mostrar_contacto(); return 0; }
En línea
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
Hola no se que dudas tengas... Te dejo 2 videos de mi canal de youtube que te podrian servir.VIDEO VIDEO Espero y te sirvan de ejemplo
En línea
Angel774
Desconectado
Mensajes: 12
Ya vi los vídeos, y te lo agradezco en si mi duda es como cargar el archivo en el arreglo lista para después trabajar con el
En línea
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
a ok para empezat deberia de dejar una estructura sin funciones, y delegar esas funciones a la clasr agenda
En lugar de:
struct contacto
{
char nombre[ 30 ] ;
char direccion[ 30 ] ;
int numero;
void pedirdatos( ) ;
void mostrardatos( ) ;
} ;
Mejor asi mas limpio:
struct contacto
{
char nombre[ 30 ] ;
char direccion[ 30 ] ;
int numero;
} ;
Las funciones las pasas a la clase agenda.
Y para cargar el archivo seguimos el ejemplo del video.
Saludos
En línea
Angel774
Desconectado
Mensajes: 12
Gracias amigo, pero tu estas ocupando fwrite() y yo tengo que ocupar fscanf() para cargar la información en el arreglo y trabajar en el arreglo
En línea
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
Necesariamente tiene que ser fscanf?
Para guardar estructuras lo ideal es fwrite y fread, tambien se puede hacer con fscanf solo que ahi necesitas leer dato por dato.
Y si quieres modificar un dato en especifico tendras que escribir y reescribir el archivo en cada modificacion. Cosa que con fwrite no necesitas..
No he tenido chance de ralalizar un vídeo con fscanf pero en teoria tienes que leer linea por linea como su fuera la entrada estandar...
es lo mismo que
Si sabés usar el segundo sabras usar el primero solo cambias stdin por tu filedescriptor...
Trata de crear primero la funcion guardar los guardas con fprintf un dato por linea y ya que crees el archivo lo tratas de leer.
Saludos
En línea
Angel774
Desconectado
Mensajes: 12
Es que de hecho tengo que leer linea por linea ya que no tengo que modificar el archivo directamente, mas bien tengo que pasar toda la informacion del archivo a un arreglo una vez ahi, trabajo sobre el arreglo y no en el archivo
agenda::agenda() { FILE *arch; cont=0; arch=fopen("agenda.txt","r"); while(!feof(arch)) { fscanf(arch,"%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 ]",&(lista[cont])); fgetc(arch); cont++; } fclose(arch); }
« Última modificación: 7 Junio 2016, 02:24 am por Angel774 »
En línea
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
fscanf(arch,"%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 ]",&(lista[cont]));En mi vida habia visto un formato de cadena asi para leer
"%[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 ]"
Deberia de ser algo como :
{
fscanf ( arch
, "%s" ,& lista
[ cont
] .
nombre ) ; fscanf ( arch
, "%s" ,& lista
[ cont
] .
direccion ) ; fscanf ( arch
, "%i" ,& lista
[ cont
] .
numero ) ; cont++;
}
Aunque creo, no estoy seguro de como procesar lel retorno de linea correctamente con fscanf tengo mucho sin usarlo frecentemente, incluso te recomendaria
fgets para las cadenas y el numero, posteriormente preocesas el buffer temporal del numero con atoi...
Aunque nuevamente insisto ¿Es totalmente necesario que sea fscanf?
Repito es mas eficiente leer una estructura con fread...
Saludos
« Última modificación: 7 Junio 2016, 04:43 am por AlbertoBSD »
En línea
Angel774
Desconectado
Mensajes: 12
Muchas gracias amigo
si era asi, otra duda ¿Como añado un nuevo contacto al arreglo lista?
En línea
AlbertoBSD
Programador y
Moderador Global
Desconectado
Mensajes: 3.705
🏴 Libertad!!!!!
Tu variable contador es el numero del proximo en la lista:
int cont;
Entonces miestras no leas mas de 60 contactos desde el archivo, existira espacio suficiente para 60 menos los leidos.
En tu funcion:
void contacto:: pedirdatos ( )
{
cout<< "Introduce nombre:" ;
cin>> nombre;
cout<< "Direccion:" ;
cin>> direccion;
cout<< "Telefono:" ;
cin>> numero;
}
deberia de quedar como
void contacto:: pedirdatos ( )
{
cout<< "Introduce nombre:" ;
cin>> lista[ cont] .nombre ;
cout<< "Direccion:" ;
cin>> lista[ cont] .direccion ;
cout<< "Telefono:" ;
cin>> lista[ cont] .numero ;
cont++;
}
O algo parecido.
Saludos
En línea
Mensajes similares
Asunto
Iniciado por
Respuestas
Vistas
Último mensaje
ayuda a llenar una pila automaticamente ya tengo el vaciado solo me falta llenar
Java
smallville121
0
3,220
21 Mayo 2012, 16:40 pm
por smallville121
[C] Llenar arreglo con recursividad
Programación C/C++
edr89
2
11,660
6 Noviembre 2013, 04:15 am
por edr89
[C] Llenar archivo Binario, y borrar datos mayores al promedio
Programación C/C++
ramaa000
3
4,742
5 Marzo 2015, 02:57 am
por rir3760
Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h")
« 1 2 »
Programación C/C++
MartNahuel95
19
11,548
10 Junio 2016, 05:47 am
por AlbertoBSD
Como llenar un arreglo a partir de un json
PHP
d91
1
3,279
10 Febrero 2017, 20:48 pm
por mchojrin