| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
Mayacker
Registrado: 16 Nov 2007 Mensajes: 6
| Publicado: 16/11/2007 10:49 pm | | | Título: archivos+estructura |
| ayuda con este codigo, lo que estoy tratando de hacer es guardar la informacion de una estructura a un archivo el codigo es este
| Código: | #include <iostream.h> #include <fstream.h> #include <stdio.h> #include <conio.h> #include <string.h> #include <ctype.h>
struct libros { char id[10]; char cantidade[3]; char autor[40]; char nomlibro[40]; char tema1[30]; char tema2[30]; }datos[100]; void grabar(); FILE *archi; char linea[1024]; void main() { int i; char op;
while (toupper(op) != 'N') { for (i = 0; i <= 99; i= i+1); { clrscr(); cout << "Introduzca ID del libro: "; cin >>datos[i].id; cout << "Introduzca Nombre del libro: "; cin >>datos[i].nomlibro; cout << "Introduzca Autor: " ; cin >>datos[i].autor; cout << "Introduzca Tema 1: "; cin >>datos[i].tema1; cout << "Introduzca Tema 2: "; cin >>datos[i].tema2; cout << "Introduzca Cantidad Existente: "; cin >>datos[i].cantidade; } cout<<"Desea ingresar otro dato[S/N]: "; cin>>op; } grabar(); getch(); }
void grabar() { int i; archi = fopen("libros.txt","w"); for (i=0;i<=99;i= i + 1) { strcpy(linea,""); strcat(linea,datos[i].id); strcat(linea," "); strcat(linea,datos[i].nomlibro); strcat(linea," "); strcat(linea,datos[i].autor); strcat(linea," "); strcat(linea,datos[i].tema1); strcat(linea," "); strcat(linea,datos[i].tema2); strcat(linea," "); strcat(linea,datos[i].cantidade); strcat(linea," "); printf("linea tiene %s",linea); getchar(); strcat(linea,"\n"); fputs(linea,archi); } fclose(archi); }
|
soy novato en el lenguaje c++ y agradeciria bastante su ayuda |
| | Volver arriba | |  | daltomi
Registrado: 28 Abr 2007 Mensajes: 120 Ubicación: Argentina
| Publicado: 18/11/2007 2:53 am | | | Título: |
| Hola. En C++ se podría utilizar la plantilla vector para ir guardando las estructuras que el usuario necesite, esto, para no reservar un array de 100 elementos del tipo libros, al menos claro que sea necesario para resolver tú problema. Además, como podrás observar, hice uso de la plantilla ofstream para el manejo del archivo de salida, esta funcion está declarada en el archivo fstream. He modificado la función grabar para convertirla en una plantilla que permita como argumento la variable lib_vDatos que es del tipo vector, la misma se pasa como referencia. Para determinar la cantidad de libros ingresados he utilizado la propiedad iterator para asi recorrer el array e ir escribiendo los datos en el archivo.
| Código: | //Visual C++ v.6.0 #include <iostream> //cout #include <fstream> //ofstream #include <vector>
using namespace std;
struct libros { char id[10]; char cantidade[3]; char autor[40]; char nomlibro[40]; char tema1[30]; char tema2[30]; };
template<typename T> void grabar(T& lib_data);
int main(int argc, char* argv[]) { char op; libros lib_temp; vector<libros>lib_vDatos;
while (!(op=='N' || op=='n')) { system("cls"); cout << "Introduzca ID del libro: "; cin >>lib_temp.id; cout << "Introduzca Nombre del libro: "; cin >>lib_temp.nomlibro; cout << "Introduzca Autor: " ; cin >>lib_temp.autor; cout << "Introduzca Tema 1: "; cin >>lib_temp.tema1; cout << "Introduzca Tema 2: "; cin >>lib_temp.tema2; cout << "Introduzca Cantidad Existente: "; cin >>lib_temp.cantidade;
lib_vDatos.push_back(lib_temp); cout<<"Desea ingresar otro dato[S/N]: "; cin>>op; } grabar(lib_vDatos); getchar(); return 0; }
template<typename T> void grabar(T& lib_data) { ofstream f("libros.txt"); if(f != NULL) { typename T::iterator ipos(lib_data.begin()); typename T::iterator iend(lib_data.end()); do{ f << ipos->id << " "; f << ipos->nomlibro << " "; f << ipos->autor << " "; f << ipos->tema1 << " "; f << ipos->tema2 << " "; f << ipos->cantidade << " " << endl; ++ipos; }while(ipos != iend); f.close(); } }
|
Saludos. |
| | Volver arriba | |  | Mayacker
Registrado: 16 Nov 2007 Mensajes: 6
| Publicado: 18/11/2007 12:50 pm | | | Título: |
| Gracias por tu ayuda daltomi pero te cuento que el compilador que estoy utilizando es Borland c++ y me da error .... template<typename T> void grabar(T& lib_data); ... me imagino porq tengo que utilizar visual c++ ..... te envio mi correo a ver si me puedes ayudar gracias!! |
| | Volver arriba | |  | | daltomi
Registrado: 28 Abr 2007 Mensajes: 120 Ubicación: Argentina
| Publicado: 18/11/2007 8:37 pm | | | Título: |
| Hola. Ten en cuenta que el uso de plantillas está soportado por cualquier compilador de C++, y la del ejemplo es de la más sencillas, quiero decir, no necesitas utilizar Visual C++ para tal fin. Si bien no indicaste cual es exactamente el error que marca el compilador, voy a tirar algunas posibles soluciones a ciegas. Puede que el compilador necesite que la plantilla esté definida y declarada en un módulo aparte, en un archivo de cabecera(extensión .h o .hpp) el cual deberias incluirlo con la directiva #include "grabar.h"; ten en cuenta que el módulo para la plantilla también necesita los archivos de cabecera que existen en el módulo main, por lo tanto puedes colocar la directiva asi:
| Código: | //Módulo main #include <iostream> //cout #include <fstream> //ofstream #include <vector> #include "grabar.h" //al final.
using namespace std;
|
Ya que sólo se llama una vez a la función grabar se la podría definir/declarar como inline, directamente en el módulo main:
| Código: | //siempre antes de la función main. template<typename T> inline void _grabar(T& lib_data) { ofstream f("libros.txt"); if(f != NULL) ... }
int main(..) { ... }
|
Teniendo en cuenta lo primero, lo de crear un módulo aparte, puede que tengas que ser más explicito en el tipo de datos que espera la funcion grabar en el momento de su llamada:
| Código: | ... //importante el espacio:> > grabar<vector<libros> >(lib_vDatos);//!buh getchar(); ...
|
Por último,puedes cambiar el calificador <typename T> por <class T> aunque éste último se lo utiliza para objetos, o yo diria, "clases puras".
No está demás decir que desconozco el uso de Borland C++, espero que puedas resolver éste problema. Saludos.
PS: no olvides indicar cual es el error que muestra el compilador. |
| | Volver arriba | |  | Mayacker
Registrado: 16 Nov 2007 Mensajes: 6
| Publicado: 19/11/2007 6:40 am | | | Título: |
| daltomi!!! gracias por tu ayuda daltomi psss.... ya lo probe en visual c++ 6.0 y ya esta listo!!! gracias por tu ayuda!! muy agradecido!!  |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |