Есть консольная программа, которая записывает в файл в бинарном формате таблицу или считывает ее же из бинарного файла. Для того чтобы записать или считать используются аргументы запуска (режим запуска //кол-во строк //название файла).
Работает вроде исправно и при записи и при чтении, но вот только после выхода из цикла чтения и выхода на финишную прямую вызывается исключение нарушения доступа для чтения _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;
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Каким образом в c++ можно организовать копирование файла с компьютера на usb устройство (телефон/флешка), подключенный через usb?
Дан массив A размера NВывести вначале его элементы с нечетными номерами в порядке возрастания номеров, а затем — элементы с четными номерами...