Ошибка “исключение нарушения доступа” в С++

139
02 марта 2018, 17:21

Есть консольная программа, которая записывает в файл в бинарном формате таблицу или считывает ее же из бинарного файла. Для того чтобы записать или считать используются аргументы запуска (режим запуска //кол-во строк //название файла).

Работает вроде исправно и при записи и при чтении, но вот только после выхода из цикла чтения и выхода на финишную прямую вызывается исключение нарушения доступа для чтения _Pnext.

Программу всю 10к раз перепроверил, но так и ошибки не нашел. Помогите найти ее пожалуйста (скорее всего она в одном из методов класса Table).

Table.h

#pragma once
#include <iostream>
#include <iomanip>
#include <string>
#include <cstring>
#include <fstream>
#include <vector>
using namespace std;
class rowInfoPC
{
public:
    string procType;
    int frequency;
    int RAM;
    int hardDisk;
    string monitorType;
};
class Table
{
public:
    vector <rowInfoPC> rows;
    string fileName;
    int numberOfRows;
    ifstream ItableFile;
    ofstream OtableFile;
    Table(string);
    void rewrite(int);
    void showTable(int);
    void read(int);
};

Table.cpp

#include "Table.h"

Table::Table(string a){
    fileName = a;
}
void Table::rewrite(int numberOfRewriteRows){
    rows.resize(numberOfRewriteRows);
    for (int i = 0; i < numberOfRewriteRows; i++) {
        cout << "Строка №" << i+1<<endl;
        cout << "Тип процессора: ";cin >> rows[i].procType;
        cout << "Тактовая частота: "; cin>>rows[i].frequency;
        cout << "Объем оперативной памяти: "; cin >> rows[i].RAM;
        cout << "Объем памяти жесткого диска: "; cin >> rows[i].hardDisk;
        cout << "Тип монитора: "; cin>> rows[i].monitorType;
    }
    showTable(numberOfRewriteRows);
    cout << "Вы точно хотите записать/перезаписать файл с этими даннымми? Y/N";
    char ansver;
    cin >> ansver;
    if (ansver == 'Y') {
        OtableFile.open(fileName, ios::binary);
        OtableFile.write((char*)&numberOfRewriteRows, sizeof(numberOfRewriteRows));
        for (int i = 0; i < numberOfRewriteRows; i++){
            /*buffer = rows[i].procType.c_str();
            OtableFile.write((char*)&buffer, strlen(buffer));
            OtableFile.write((char*)&rows[i].frequency, sizeof(rows[i].frequency));
            OtableFile.write((char*)&rows[i].RAM, sizeof(rows[i].RAM));
            OtableFile.write((char*)&rows[i].hardDisk, sizeof(rows[i].hardDisk));
            buffer = rows[i].monitorType.c_str();
            OtableFile.write((char*)&rows[i].monitorType, strlen(buffer));*/
            OtableFile.write((char*)&rows[i], sizeof(rows[i]));
        }
    }
    OtableFile.close();
}
void Table::showTable(int numberShowRows) {
    cout.setf( ios::left);
    cout << setw(3)<<  "№" << setw(25) <<  "Тип процессора" << setw(25) << "Тактовая частота (MHz)" << setw(25) <<  "Емкость ОП (МБ)" << setw(25) <<  "Емкость ЖМН (ГБ)" << setw(25) <<  "Тип монитора" << endl;
    for (int i = 0; i < numberShowRows;i++) {
        if (i < (int)rows.size()) {
            cout << setw(3) << i + 1 << setw(25) << rows[i].procType << setw(25) << rows[i].frequency << setw(25) << rows[i].RAM << setw(25) << rows[i].hardDisk << setw(25) << rows[i].monitorType;
            cout << endl;
        }
    }
}
void Table::read(int numberReadRows) {
    ItableFile.open(fileName);
    ItableFile.read((char*)&numberOfRows, sizeof(numberOfRows));
    int i = 0;
    rows.resize(numberReadRows>numberOfRows?numberOfRows:numberReadRows);
    while (i < numberReadRows&&i<numberOfRows) {
        ItableFile.read((char*)&rows[i], sizeof(rows[i]));
        i++;
    }
    showTable(numberReadRows>numberOfRows ? numberOfRows : numberReadRows);
    ItableFile.close();
}

Исходный код.cpp

#include "Table.h"
using namespace std;
int main(int argc, const char* argv[]){
    setlocale(LC_CTYPE, "Russian");
    const char* parametrs[] = { "-c", "-r" };

    if (argc == 2 && (!strcmp(argv[1], "--help") || !strcmp(argv[1], "-h"))){
        cout << "\n\n-с N file_name - запуск программы в режиме создания электронной\n"
            << "таблицы записей, N – количество записей, file_name – имя текстового файла, в\n"
            << "котором будет сохранен массив (таблица) записей.\n\n"
            << "-r N file_name - запуск программы в режиме чтения содержимого"
            << "текстового файла file_name, на экран должны быть выведены не более N\n"
            << "записей. Следует учесть, что реальное количество записей в файле может не\n"
            << "совпадать с заданным значением N.\n";
        return 0;
    }
    else if (argc == 4){
        char check_flag = 0;
        for (int i = 0; i<2; i++){
            if (!strcmp(argv[1], parametrs[i])){ check_flag = 1; continue; }
        }
        if (!check_flag){
            cout << "В написании аргумента совершена ошибка (\"--help\" или \"-h\" для справки )\n";
            system("pause");
            return 1;
        }
        else{
            if (!strcmp(argv[1], "-c")){
                Table tableC(argv[3]);
                tableC.rewrite(atoi(argv[2]));
            }
            else if (!strcmp(argv[1], "-r")) {
                Table tableR(argv[3]);
                tableR.read(atoi(argv[2]));     
            }
        }
    }
    else{
        cout << "Программа запущена с неправильным кол-вом аргументов (\"--help\" или \"-h\" для справки )\n";
        return 2;
    }
    system("pause");
    return 0;
}
READ ALSO
Что такое .inc файлы [требует правки]

Что такое .inc файлы [требует правки]

Зачем нужныinc файлы, и что в них записывают?

124
Передача файла на usb устройство

Передача файла на usb устройство

Каким образом в c++ можно организовать копирование файла с компьютера на usb устройство (телефон/флешка), подключенный через usb?

133
Array задачу не могу решить, вывожу четные элементы, а нечетные не выводятся

Array задачу не могу решить, вывожу четные элементы, а нечетные не выводятся

Дан массив A размера NВывести вначале его элементы с нечетными номерами в порядке возрастания номеров, а затем — элементы с четными номерами...

143
Выделение памяти под map

Выделение памяти под map

Создаю map так:

107