Excepción no controlada en 0x0F8DCCC8 (msvcp110d.dll) en Tarea3_2.exe: 0xC0000005: Infracción de acceso al leer la ubicación 0x004C9B34.
tambien dejo una captura:
creo que es algo relacionado con los string del struct pero no se exactamente que. También vale aclarar que el error sucede al ejecutar el programa por segunda ocasión, es decir la primera vez se ejecuta perfecto, hace todas sus funciones, el error ocurre si se selecciona una opción del menu (la segunda ocasión que se ejecuta como especifique antes ), justo después de seleccionar la opción "Salir", osea al llegar al "return 0" del main.
Aquí dejo el código.
Código:
#include <iostream> #include <fstream> #include <string> #include <cstdlib> #include <iomanip> using namespace std; void menu(short *); void encabezado(); void agregarNota(struct datos &); void modificarNota(struct datos &); void eliminarNota(struct datos &); void listarNotas(struct datos &); int buscarCodigo(struct datos &, string); void limpiaStrcut(struct datos &); struct datos { string codigo; string descripcion; bool existe; }; struct datos nota; int main() { ifstream gestor("gestor.dat"); if (!gestor.good()) ofstream gestor("gestor.dat"); short opcion; do { limpiaStrcut(nota); menu(&opcion); switch (opcion) { case 1: agregarNota(nota); break; case 2: modificarNota(nota); break; case 3: eliminarNota(nota); break; case 4: system("cls"); listarNotas(nota); system("pause"); system("cls"); break; } } while (opcion != 5); return 0; } void menu(short *opc) { encabezado(); cout << "Seleccione una opci\242n:\n\n" << "1) Agregar nota\n" << "2) Modificar nota\n" << "3) Eliminar nota\n" << "4) Listar notas\n" << "5) Salir\n\n"; cin >> *opc; } void limpiaStrcut(struct datos ¬a) { nota.existe = false; nota.codigo.clear(); nota.descripcion.clear(); } void encabezado() { cout << "****************" << "\nGestor de notas\n" << "****************\n\n"; } void agregarNota(struct datos ¬a) { string codi; string desc; int comprobar; cin.ignore(); system("cls"); do { cout <<"\nIngrese un c\242digo para su nota (m\240ximo 4 caracteres):\n"; cin.clear(); getline(cin, codi); comprobar = buscarCodigo(nota, codi); if (codi.length() > 4) { cerr << "\nEl c\242digo supera el m\240ximo de caracteres permitido.\n\n"; system("pause"); system("cls"); } else if (comprobar != -1){ cerr << "\nLa clave ingresada ya existe.\n\n"; system("pause"); system("cls"); } } while (codi.length() > 4 || comprobar != -1); do { cout <<"Ingrese una descripci\242n para su nota (m\240ximo 250 caracteres):\n"; cin.clear(); getline(cin, desc); if (desc.length() > 250) { cerr << "\nLa descripci\242n supera el m\240ximo de caracteres permitido.\n\n"; system("pause"); system("cls"); } } while (desc.length() > 250); nota.codigo = codi; nota.descripcion = desc; nota.existe = true; ofstream copiArchi("gestor.dat", ios::binary | ios::out |ios::app); copiArchi.write( reinterpret_cast< char *> (¬a), sizeof(datos) ); copiArchi.close(); cout << "\n\nNota agregada con \202xito\n\n"; system("pause"); system("cls"); } void modificarNota(struct datos ¬a) { string clave; string nuevoCodigo; string nuevaDescripcion; int ubicacion; int comprobar; system("cls"); do { listarNotas(nota); cout << "\nDigite el c\242digo de la nota que desea modificar:\n"; cin.sync(); getline(cin, clave); ubicacion = buscarCodigo(nota, clave); if (clave.length() > 4) { cerr << "\nEl c\242digo supera el m\240ximo de caracteres permitido.\n\n"; system("pause"); system("cls"); } else if (ubicacion == -1) { cerr << "\nLa clave ingresada no existe.\n\n"; system("pause"); system("cls"); } } while (ubicacion == -1); do { cout <<"\nIngrese un nuevo c\242digo para su nota (m\240ximo 4 caracteres):\n"; cin.sync(); getline(cin, nuevoCodigo); comprobar = buscarCodigo(nota, nuevoCodigo); if (nuevoCodigo.length() > 4) { cerr << "\nEl c\242digo supera el m\240ximo de caracteres permitido.\n\n"; system("pause"); system("cls"); } else if (comprobar != -1) { cerr << "\nLa clave ingresada ya existe.\n\n"; system("pause"); system("cls"); } } while (nuevoCodigo.length() > 4 || comprobar != -1); do { cout <<"\nIngrese la descripci\242n para su nota:\n"; getline(cin, nuevaDescripcion); if (nuevaDescripcion.length() > 250) { cerr << "\nLa descripci\242n supera el m\240ximo de caracteres permitido.\n\n"; system("pause"); system("cls"); } } while (nuevaDescripcion.length() > 250); nota.codigo = nuevoCodigo; nota.descripcion = nuevaDescripcion; fstream reempArchi("gestor.dat", ios::out | ios::in | ios::binary); reempArchi.seekp( (ubicacion * sizeof(datos) ) ); reempArchi.write( reinterpret_cast< char *> (¬a), sizeof(datos) ); reempArchi.close(); cout << "\n\nNota modificada con \202xito\n\n"; system("pause"); system("cls"); } void listarNotas(struct datos ¬a) { ifstream leeArchi("gestor.dat", ios::in | ios::binary ); int i = 0; while ( leeArchi ) { leeArchi.seekg(i * sizeof(datos)); leeArchi.read(reinterpret_cast<char *> (¬a), sizeof (datos)); i++; if (leeArchi.eof()) { leeArchi.close(); break; } if (nota.existe == true) { cout << "\nCodigo: " << nota.codigo.c_str() << "\nDescricion: " << nota.descripcion.c_str() << "\n\n"; } } } void eliminarNota(struct datos ¬a) { string clave; int ubicacion; system("cls"); cin.ignore(); do { listarNotas(nota); cout << "\nDigite el c\242digo de la nota que desea eliminar:\n"; getline(cin, clave); ubicacion = buscarCodigo(nota, clave); if (clave.length() > 4) { cerr << "\nEl c\242digo supera el m\240ximo de caracteres permitido.\n\n"; system("pause"); system("cls"); } else if (ubicacion == -1) { cerr << "\nLa clave ingresada no existe.\n\n"; system("pause"); system("cls"); } } while (ubicacion == -1); limpiaStrcut(nota); fstream borraArchi("gestor.dat", ios::out | ios::in | ios::binary); borraArchi.seekp( (ubicacion * sizeof(datos) ) ); borraArchi.write( reinterpret_cast< char *> (¬a), sizeof(datos) ); borraArchi.close(); cout << "\n\nNota eliminada con \202xito\n\n"; system("pause"); system("cls"); } int buscarCodigo(struct datos ¬a, string clav) { ifstream buscaArchi("gestor.dat", ios::binary | ios::in); int i = 0; while (!buscaArchi.eof()) { buscaArchi.seekg( i * sizeof(datos) ); buscaArchi.read(reinterpret_cast<char *> (¬a), sizeof (datos) ); if (nota.codigo == clav) return i; i++; } return -1; }