[SOLUCIONADO] Ayuda con manejo de archivo. Código lenguaje C

Iniciado por neox, Agosto 22, 2011, 12:19:56 AM

Tema anterior - Siguiente tema

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

Agosto 22, 2011, 12:19:56 AM Ultima modificación: Marzo 06, 2016, 11:25:21 PM por Gabriela
wenas gente... vengo a ver si alguien me logra ayudar a que se cree el archivo de un arreglo y todo lo que contiene... yo ya lo tengo hecho, sin embargo en la ejecucion del programa me dice: Excepción no controlada en 0x0f4813af (msvcr100d.dll) en 2prog lab.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x00000017.

les copio el codigo a ver si me ayudan se los agradeceria mucho:

Código: c
// prog 2 lab.cpp: define el punto de entrada de la aplicación de consola.
//

#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

using namespace std;

/*Desarrolle una estructura de datos de asistente, el cual debe tener cedula, numero de carnet, instituto en el que estudia, nombre y anidar otra estructura; la cual se llama curso_asistido y debe tener nombre del curso, profesor del curso, y código del curso. Y un menú para Mostar, llenarlas, eliminar, guardar y cargar.*/

struct curso_asistido{
char ncurso[10];
char prof_curso[20];
int codcurso;
};

struct asistente{
int ced;
int carne;
char insti[30];
char nombre[30];
curso_asistido cursos[10];
int cr;
bool activo;

};
asistente arreglo[50];
int cont=0;

void guardar(asistente arreglo[], int cont){
system("CLS");//limpia la pantalla
cout<<endl<<endl;
FILE* arch;
arch = fopen("archivo.txt", "w+");
for (int y=0;y<cont;y++){
if (arreglo[y].activo== true){//solo se guardaran aquellas personas que esten activas \n"
cout<<"Nombre: "<<arreglo[y].nombre<<" Cedula: "<<arreglo[y].ced<<" -GUARDADO-"<<endl;
fprintf(arch, "\n%s", arreglo[y].nombre);
fprintf(arch, "\n%i", arreglo[y].carne);
fprintf(arch, "\n%s", arreglo[y].insti);
fprintf(arch, "\n%i", arreglo[y].cr);
for (int i=0; i<arreglo[y].cr;i++){
fprintf(arch, "\n%s", arreglo[y].cursos[i].ncurso);
fprintf(arch, "\n%s", arreglo[y].cursos[i].prof_curso);
fprintf(arch, "\n%s", arreglo[y].cursos[i].codcurso);
if(y==(cont-1)){fprintf (arch, "\n%i", arreglo[y].ced);}// se eliminan los enter al final del archivo de texto
else fprintf (arch, "\n%i\n\n", arreglo[y].ced);
}
}
fclose(arch);
}
}

void cargararchivo(asistente arreglo[],int &cont){//El arreglo no debe ingresar como referencia, pero el contador si para que su valor cambie respecto a lo que se hace en la funcion
system("CLS");
FILE*arch;
arch=fopen("archivo.txt","r");
if(arch==NULL){
cout<<"no se encontro el archivo"<<endl;
}else{
char numT[15];
while(!feof(arch)){
fscanf(arch,"%s",arreglo[cont].nombre);//cont al inicio esta en cero
fscanf(arch,"%i",arreglo[cont].carne);
fscanf(arch,"%s",arreglo[cont].insti);
fscanf(arch,"%i",arreglo[cont].cr);
for (int i=0; i<arreglo[cont].cr; i++){
fscanf(arch,"%s",arreglo[cont].cursos[i].ncurso);
fscanf(arch,"%s",arreglo[cont].cursos[i].prof_curso);
fscanf(arch,"%s",arreglo[cont].cursos[i].codcurso);
fscanf(arch,"%s",numT);
arreglo[cont].ced=atoi(numT);
}

cout<<endl<<endl<<"Nombre: "<<arreglo[cont].nombre<<" Cedula: "<<arreglo[cont].ced<<"--CARGADO--"<<endl;
arreglo[cont].activo=true;// Activa de nuevo a la persona
cont++;
}
fclose(arch);
}
cout<<endl<<" Presione una tecla para continuar..."<<endl;
}

void nasistente(asistente arreglo[],int &cont){
system ("CLS");
cout<<"****************************************************************************************************"<<endl;
cout<<" INGRESO DE NUEVO ESTUDIANTE"<<endl;
cout<<"****************************************************************************************************"<<endl<<endl;
cout<<"Ingrese el nombre del estudiante: ";
cin>>arreglo[cont].nombre;
cout<<"Ingrese la cedula del estudiante: ";
cin>>arreglo[cont].ced;
cout<<"Ingrese el carné del estudiante: ";
cin>>arreglo[cont].carne;
cout<<"Ingrese el instituto donde estudia: ";
cin>>arreglo[cont].insti;
cout<<" Ingrese el numero de cursos matriculados:  ";
cin>>arreglo[cont].cr;
cout<<endl;
for (int i=0; i<arreglo[cont].cr; i++){
cout<<"Curso #"<<i+1<<endl;
cout<<"Ingrese el curso al que asiste: ";
cin>>arreglo[cont].cursos[i].ncurso;
cout<<"Ingrese el codigo de curso: ";
cin>>arreglo[cont].cursos[i].codcurso;
cout<<"Ingrese el profesor que da el curso: ";
cin>>arreglo[cont].cursos[i].prof_curso;
arreglo[cont].activo=true;
}
cont++;
}
void versis(asistente[],int &cont){
system("CLS");
cout<<"***************************** LISTA DE ALUMNOS ******************************"<<endl<<endl;
if(cont==0){
cout<<"LA LISTA ESTA VACIA!!"<<endl;
}
else{
for (int i=0; i<cont; i++){
if(arreglo[i].activo==true){
cout<<"Alumno: "<<arreglo[i].nombre<<endl;
cout<<"Cedula: "<<arreglo[i].ced<<endl;
cout<<"Carné: "<<arreglo[i].carne<<endl;
cout<<"Instituto: "<<arreglo[i].insti<<endl;
for (int n=0; n<arreglo[i].cr;n++){
cout<<"Curso: "<<arreglo[i].cursos[n].ncurso<<endl;
cout<<"Codigo del curso: "<<arreglo[i].cursos[n].codcurso<<endl;
cout<<"Profesor que imparte el curso: "<<arreglo[i].cursos[n].prof_curso<<endl<<endl;
} cout<<"***************************** FIN DE LA LISTA *****************************"<<endl<<endl;
}
}
}
}
void eliminar(asistente[], int &cont){
system("CLS");
cout<<"Ingrese el nombre del estudiante a eliminar:  ";
char est[30];cin>>est;
for (int i =0; i<cont; i++){
if (strcmp(est, arreglo[i].nombre)==0){
arreglo[i].activo=false;
cout<<"El estudiante ha sido eliminado de la base de datos"<<endl<<endl;
}
else{
cout<<"EL ESTUDIANTE NO EXISTE EN BASE DE DATOS"<<endl;
}
}
}
void main(){
bool men= true;
int op= 0;
while (men){
system ("CLS");
cout<<"****************************************************************************************************"<<endl;
cout<< "MENU DE OPERACIONES"<<endl;
cout<<"****************************************************************************************************"<<endl<<endl;
cout<<"1- Agregar estudiante-->  "<<endl;
cout<<"2- Listar estudiantes-->  "<<endl;
cout<<"3- Borrar estudiante -->  "<<endl;
cout<<"4- Guardar lista a archivo --> "<<endl;
cout<<"5- Cargar lista de archivo -->  "<<endl;
cout<<"6- -> SALIR <- "<<endl<<endl;
cout<<"¿ Que accion desea realizar ?  ";
cin>>op;
switch (op){
case 1:{
nasistente( arreglo,cont);
cout<<"Alumno agregado con exito "<<endl<<endl<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 2:{
versis(arreglo, cont);
cout<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 3:{
eliminar(arreglo,cont);
cout<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 4:{
guardar(arreglo, cont);
cout<< "Archivo guardado con exito"<<endl<<endl<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 5:{
//cargar(arreglo, cont);
cout<<" Archivo cargado con exito" <<endl<<endl<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 6:{
men= false;
cout<<"Presione una tecla para salir...";
getch();
break;
   }
default:{
cout<<endl<<"La opcion digitada no exite"<<endl<<endl;
cout<<" Presione una tecla para continuar..."<<endl;
getch();
}
}
}
}

Agosto 22, 2011, 12:39:52 AM #1 Ultima modificación: Agosto 22, 2011, 12:51:37 AM por [C]orrupted[B]yte
Yo lo compile sin problemas solo quite la primera libreria por que no la tengo, pero corre perfecto

Edit:
No no corre perfecto nomas quitando la primera libreria  :P tambien cambie el void main por int main que es lo correcto nunca debes poenr void main aunque asi venga en la mayoria de los libros de programacion, ademas de que tienes un error en la funcion de guardar ala hora de guardar los datos de los alumnos ingresados se pasma y es necesario cerrarlo, debugealo para ver cual es el problema en dicha funcion

te creo el archivo y luego lo pudiste cargar??

nop, me genera un error ala ora de guardar

ese es el que trato de solucionar jeje...

debbugealo paso a paso lo mas probable es que el error lo tengas en alguno de los 2 for o los 2 if

en el paso a paso justo en el momento que entra a la funcion guardar me tira el error :S

hace el cout.... y luego cae..

es que no debes de poner un mensaje de instrucion completada asta que no se completa ay lo que haces es lanzar un mensaje de fichero guardado cuando aun no se comienza el proceso pero viendo el codigo a simple vista tienes el error en la variable cont ya que la pones = 0 y mas abajo la utilizas en el for

cont aumenta en 1  cada vez que se agrega un estudiante...

por eso dije a simple vista jejejeje esque no e analizado el code completo pero am... dejame verlo oy o mañana (si me da tiempo) y te digo cual es el error o si lo encuentras nos comentas cual fue =)

bueno al final he logrado el archivo... les dejo el codigo por si a alguien que venga empezando le sirve de algo!! SALUDOS!!


Código: c
// prog 2 lab.cpp: define el punto de entrada de la aplicación de consola.
//

#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

using namespace std;

/*Desarrolle una estructura de datos de asistente, el cual debe tener cedula, numero de carnet, instituto en el que estudia, nombre y anidar otra estructura; la cual se llama curso_asistido y debe tener nombre del curso, profesor del curso, y código del curso. Y un menú para Mostar, llenarlas, eliminar, guardar y cargar.*/

struct curso_asistido{
char ncurso[10];
char prof_curso[20];
int codcurso;
};

struct asistente{
int ced;
int carne;
char insti[30];
char nombre[30];
curso_asistido cursos[10];
int cr;
bool activo;

};
asistente arreglo[50];
int cont=0;

void guardar(asistente arreglo[], int cont){
system("CLS");//limpia la pantalla
cout<<endl<<endl;
FILE* arch;
arch = fopen("archivo.txt", "w+");
for (int y=0;y<cont;y++){
if (arreglo[y].activo== true){//solo se guardaran aquellas personas que esten activas \n"
cout<<"Nombre: "<<arreglo[y].nombre<<" Cedula: "<<arreglo[y].ced<<" -GUARDADO-"<<endl;
fprintf(arch, "%s", arreglo[y].nombre);
fprintf(arch, "\n%i", arreglo[y].carne);
fprintf(arch, "\n%s", arreglo[y].insti);
fprintf(arch, "\n%i", arreglo[y].cr);
for (int i=0; i<arreglo[y].cr;i++){
fprintf(arch, "\n%s", arreglo[y].cursos[i].ncurso);
fprintf(arch, "\n%s", arreglo[y].cursos[i].prof_curso);
fprintf(arch, "\n%i", arreglo[y].cursos[i].codcurso);
if(y==(cont-1)){fprintf (arch, "\n%i", arreglo[y].ced);}// se eliminan los enter al final del archivo de texto
else fprintf (arch, "\n%i\n\n", arreglo[y].ced);
}
}
}
fclose(arch);
}

void cargar(asistente arreglo[],int &cont){//El arreglo no debe ingresar como referencia, pero el contador si para que su valor cambie respecto a lo que se hace en la funcion
system("CLS");
FILE*arch;
arch=fopen("archivo.txt","r");
if(arch==NULL){
cout<<"no se encontro el archivo"<<endl;
}else{
char cedT[15];
char carneT[15];
char crT[15];
char codT[15];
while(!feof(arch)){
fscanf(arch,"%s",arreglo[cont].nombre);//cont al inicio esta en cero
fscanf(arch,"%s",carneT);
arreglo[cont].carne=atoi(carneT);
fscanf(arch,"%s",arreglo[cont].insti);
fscanf(arch,"%s",crT);
arreglo[cont].cr=atoi(crT);
for (int i=0; i<arreglo[cont].cr; i++){
fscanf(arch,"%s",arreglo[cont].cursos[i].ncurso);
fscanf(arch,"%s",arreglo[cont].cursos[i].prof_curso);
fscanf(arch,"%s",codT);
arreglo[cont].cursos[i].codcurso=atoi(codT);
fscanf(arch,"%s",cedT);
arreglo[cont].ced=atoi(cedT);
}

cout<<endl<<endl<<"Nombre: "<<arreglo[cont].nombre<<" Cedula: "<<arreglo[cont].ced<<"--CARGADO--"<<endl;
arreglo[cont].activo=true;// Activa de nuevo a la persona
cont++;
}
fclose(arch);
}
cout<<endl<<" Presione una tecla para continuar..."<<endl;
}

void nasistente(asistente arreglo[],int &cont){
system ("CLS");
cout<<"****************************************************************************************************"<<endl;
cout<<" INGRESO DE NUEVO ESTUDIANTE"<<endl;
cout<<"****************************************************************************************************"<<endl<<endl;
cout<<"Ingrese el nombre del estudiante: ";
cin>>arreglo[cont].nombre;
cout<<"Ingrese la cedula del estudiante: ";
cin>>arreglo[cont].ced;
cout<<"Ingrese el carné del estudiante: ";
cin>>arreglo[cont].carne;
cout<<"Ingrese el instituto donde estudia: ";
cin>>arreglo[cont].insti;
cout<<" Ingrese el numero de cursos matriculados:  ";
cin>>arreglo[cont].cr;
cout<<endl;
for (int i=0; i<arreglo[cont].cr; i++){
cout<<"Curso #"<<i+1<<endl;
cout<<"Ingrese el curso al que asiste: ";
cin>>arreglo[cont].cursos[i].ncurso;
cout<<"Ingrese el codigo de curso: ";
cin>>arreglo[cont].cursos[i].codcurso;
cout<<"Ingrese el profesor que da el curso: ";
cin>>arreglo[cont].cursos[i].prof_curso;
arreglo[cont].activo=true;
}
cont++;
}
void versis(asistente[],int &cont){
system("CLS");
cout<<"***************************** LISTA DE ALUMNOS ******************************"<<endl<<endl;
if(cont==0){
cout<<"LA LISTA ESTA VACIA!!"<<endl;
}
else{
for (int i=0; i<cont; i++){
if(arreglo[i].activo==true){
cout<<"Alumno: "<<arreglo[i].nombre<<endl;
cout<<"Cedula: "<<arreglo[i].ced<<endl;
cout<<"Carné: "<<arreglo[i].carne<<endl;
cout<<"Instituto: "<<arreglo[i].insti<<endl;
for (int n=0; n<arreglo[i].cr;n++){
cout<<"Curso: "<<arreglo[i].cursos[n].ncurso<<endl;
cout<<"Codigo del curso: "<<arreglo[i].cursos[n].codcurso<<endl;
cout<<"Profesor que imparte el curso: "<<arreglo[i].cursos[n].prof_curso<<endl<<endl;
} cout<<"***************************** *****************************"<<endl<<endl;
}
}
}
}
void eliminar(asistente[], int &cont){
system("CLS");
cout<<"Ingrese el nombre del estudiante a eliminar:  ";
char est[30];cin>>est;
for (int i=0; i<cont; i++){
if (strcmp(est, arreglo[i].nombre)==0){
arreglo[i].activo=false;
cout<<"El estudiante ha sido eliminado de la base de datos"<<endl<<endl;

}
if (i==cont){
cout<<"El estudiante buscado no existe en base de datos"<<endl;
}
}
}
void main(){
bool men= true;
int op= 0;
while (men){
system ("CLS");
cout<<"****************************************************************************************************"<<endl;
cout<< "MENU DE OPERACIONES"<<endl;
cout<<"****************************************************************************************************"<<endl<<endl;
cout<<"1- Agregar estudiante-->  "<<endl;
cout<<"2- Listar estudiantes-->  "<<endl;
cout<<"3- Borrar estudiante -->  "<<endl;
cout<<"4- Guardar lista a archivo --> "<<endl;
cout<<"5- Cargar lista de archivo -->  "<<endl;
cout<<"6- -> SALIR <- "<<endl<<endl;
cout<<"¿ Que accion desea realizar ?  ";
cin>>op;
switch (op){
case 1:{
nasistente( arreglo,cont);
cout<<"Alumno agregado con exito "<<endl<<endl<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 2:{
versis(arreglo, cont);
cout<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 3:{
eliminar(arreglo,cont);
cout<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 4:{
guardar(arreglo, cont);
cout<< "Archivo guardado con exito"<<endl<<endl<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 5:{
cargar(arreglo, cont);
cout<<" Archivo cargado con exito" <<endl<<endl<<"Presione cualquier tecla para continuar...";
getch();
break;
   }
case 6:{
men= false;
cout<<"Presione una tecla para salir...";
getch();
break;
   }
default:{
cout<<endl<<"La opcion digitada no exite"<<endl<<endl;
cout<<" Presione una tecla para continuar..."<<endl;
getch();
}
}
}
}

Bueno, justo recién levantado, que he visto el privado de neox y veo que ya está arreglado :), me alegro.

Solucionado entonces.

Un saludo!