Программа считывает из файла уже определённое количество строк и записывает информацию в класс, после чего работает с классом. Функция Memory управляет памятью. Когда мы добавляем новый объект, функция Memory должна выделять под новый добавленный объект память. Это происходит во время работы с программой, но при выполнении повторной операции по добавлению объекта программа даёт сбой. Куда копать?
Текст файла, с которым ведётся работа:
Скотное Тверь 6
Москва Липецк 43
Псков Москва 3
Ярославль Воронеж 2
Код программы:
#include
using namespace std;
// Объявление класса
class Routes
{
int i = 0;
private:
std::string StatI;
std::string StatO;
int tm;
public:
Routes();
//~Routes();
Routes(string dep, string arr, int time);
std::string getStatO() {return StatO;};
std::string getStatI() {return StatI;};
int getTm() {return tm;};
void setStatO(std::string);
void setStatI(std::string);
void setTm(int time);
int NewRouteOpt(Routes* Fill, int N, char *file);
void Vivod(Routes *Fill, int N, char *file);
void Edit(Routes *Fill, int N, char *file);
void Write(Routes *Fill, int N, char *file);
int Read(Routes *Fill, int N, char *file);
void Sort(Routes *Fill, int N, char* file);
int MassiveRoutes(Routes *Fill, int N, char *file);
int NewDefault(Routes *Fill, int N, char *file);
void Save(Routes *Fill, int N, char* file);
int Memory(Routes *Fill, int N, char* file);
};
// Программы, использующие класс
int Routes::NewRouteOpt(Routes* Fill, int N, char *file){
N++;
Memory(Fill, N, file);
i = N - 1;
std::string bo; // буфер отправления
std::string bp; // буфер прибытия
int bt; // буфер времени
cout << "Enter Departure Station:
>> ";
cin >> bo;
Fill[i].setStatO(bo);
cout << "Enter Arrival Station:
>> ";
cin >> bp;
Fill[i].setStatI(bp);
cout << "Enter Travel Time:
>> ";
while (!(cin >> bt)){cout << "Invalid value!" << endl;
cin.clear();cin.sync();}
Fill[i].setTm(bt);
cout << "---
New route:" << endl;
cout << i << " | " << Fill[i].getStatO() << " " << Fill[i].getStatI() << " " << Fill[i].getTm() << "
---" << endl;
return N;}
void Routes::Vivod(Routes *Fill, int N, char *file){
for (int i = 0; i < N; i++){cout.setf(ios::right);cout.width(6);
cout << i << "|" << Fill[i].getStatO() << "\t|" << Fill[i].getStatI() << "\t|" << Fill[i].getTm() << endl;}}
void Routes::Edit(Routes *Fill, int N, char *file){
Routes::Vivod(Fill, N, file);
int k;
cout << "---
Enter route number to edit:
>> ";
while (!(cin >> k) || (k>=N) || (k<0)){ cout << "Invalid value!" << endl;
cin.clear();cin.sync();}
std::string bo; // буфер отправления
std::string bp; // буфер прибытия
int bt; // буфер времени
cout << "Enter Departure Station:
>> ";
cin >> bo;
Fill[k].setStatO(bo);
cout << "Enter Arrival Station:
>> ";
cin >> bp;
Fill[k].setStatI(bp);
cout << "Enter Travel Time:
>> ";
while(!(cin >> bt)){cout << "Invalid value!" << endl;
cin.clear();cin.sync();}
Fill[k].setTm(bt);
cout << "---
Changed route
---" << endl;
cout << k << " | "<< Fill[k].getStatO() << " " << Fill[k].getStatI() << " " << Fill[k].getTm() << endl;}
void Routes::Write(Routes *Fill, int N, char *file){
ofstream in(file);
for (int i = 0; i < N; i++){
cout << i << " | " << Fill[i].getStatO() << "\t" << Fill[i].getStatI() << "\t" << Fill[i].getTm() << endl;
if (i == N-1){
in << Fill[i].getStatO() << "\t" << Fill[i].getStatI() << "\t" << Fill[i].getTm();}
else{
in << Fill[i].getStatO() << "\t" << Fill[i].getStatI() << "\t" << Fill[i].getTm() << endl;}}//delete[] Fill;
}
int Routes::Read(Routes *Fill, int N, char *file){
int check = 0;
ifstream of(file,std::ios::in|std::ios::binary);
while(check == 0){
cout << "---
Enter name file with type:
>> ";
cin >> file;
of.open(file);
if (of){check = 1;}
if(!of){system("cls");
cout << "File not found!
";
check = 0;}}
char *line = new char [1024];
int col = 0, j = 0;
while (!of.eof()){
of >> Fill[j].StatO;
of >> Fill[j].StatI;
of >> Fill[j].tm;
j++;
of.getline(line, 1024, '
');
int n = strlen(line);
if( n == 1 && n == 0){
col--;}
else{
col++;}}
delete [] line;
of.close();
cout << "---
Read " << col << " rows
---" << endl;
return col;}
void Routes::Sort(Routes *Fill, int N, char* file){
Routes::Vivod(Fill, N, file);
cout << "---
Shortest route
---" << endl;
int mz = 1000000; // максимальное значение
int index;
for(int i = 0; i < N; i++){
if(Fill[i].tm<=mz){
mz=Fill[i].tm;
index = i;}}
cout << index << "|" << Fill[index].StatO << "\t|" << Fill[index].StatI << "\t|" << Fill[index].tm << endl;}
int Routes::MassiveRoutes(Routes *Fill, int N, char *file){
int pl, bf; // переменная буфера строк
std::string bo; // буфер отправления
std::string bp; // буфер прибытия
int bt; // буфер времени
cout << "How much routes you wanna add?" << endl;
while(!(cin >> pl) || pl>=4){cout << "Invalid value!" << endl;
cin.clear();cin.sync();}
int i = N;
N = N + pl;
Memory(Fill, N, file);
for ( int i = N-pl; i < N; i++){
cout << "Enter Departure Station:
>> ";
cin >> bo;
Fill[i].setStatO(bo);
cout << "Enter Arrival Station:
>> ";
cin >> bp;
Fill[i].setStatI(bp);
cout << "Enter Travel Time:
>> ";
while(!(cin >> bt)){cout << "Invalid value!" << endl;
cin.clear();cin.sync();}
Fill[i].setTm(bt);
cout << i << " | " << Fill[i].getStatO() << "\t" << Fill[i].getStatI() << "\t" << Fill[i].getTm() << endl;}
return N;}
int Routes::NewDefault(Routes *Fill, int N, char *file){
N++;
Memory(Fill, N, file);
i = N - 1;
std::string bo; // буфер отправления
std::string bp; // буфер прибытия
int bt; // буфер времени
Fill[i].StatO;
Fill[i].StatI;
Fill[i].tm;
cout << "---
New route:" << endl;
cout << i << " | " << Fill[i].getStatO() << " " << Fill[i].getStatI() << " " << Fill[i].getTm() << "
---" << endl;
return N;}
void Routes::Save(Routes *Fill, int N, char* file){
cout << "Enter file name with type:
>> ";
char name[20];
cin >> name;
cin.clear();
cin.sync();
strcpy(file,name);
Write(Fill, N, file);
return ;}
int Routes::Memory(Routes *Fill, int N, char* file){
int d = 0;
d = N;
Routes *newFill;
newFill = new Routes[d];
for (int i = 0; i < N; i++){
newFill[i] = Fill[i];
}
delete []Fill;
Fill = newFill;
}
// конструктор по умолчанию
Routes::Routes(){
StatO = "Dispatch";
StatI = "Arrival";
tm = 0;}
// возврат значений времени, станций отправления и прибытия
void Routes::setStatO(std::string ot){ // отправление
StatO = ot;}
void Routes::setStatI(std::string pr){ // прибытие
StatI = pr;}
void Routes::setTm(int time){ // время
tm = time;}
// главная функция программы
int main(){
//system("color F0");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
Routes *Fill;
Fill = new Routes[4];
int x, tick = 0;
char fn[20];
cout << "---
Laboratory work №2" << endl;
int loc = Fill->Routes::Read(Fill, loc, fn);
system("cls");
Fill->Routes::Vivod(Fill, loc, fn);
while(tick == 0){
cout << "===
Menu
===
1. Create new route (default)
2. Create new route (with parameters)
3. Create new routes
4. Edit and view routes
5. View shortest route
6. Exit" << endl;
cout << "---
>> ";
cin >> x;
cin.clear();cin.sync();
switch(x){
case 1: // создание объекта с помощью конструктора по умолчанию
system("cls");
loc = Fill->Routes::NewDefault(Fill, loc, fn);
Fill->Routes::Vivod(Fill, loc, fn);
break;
case 2: // создание объекта с помощью конструктора с параметрами
system("cls");
loc = Fill->Routes::NewRouteOpt(Fill, loc, fn);
Fill->Routes::Vivod(Fill, loc, fn);
break;
case 3: // создание объекта
system("cls");
loc = Fill->Routes::MassiveRoutes(Fill, loc, fn);
system("cls");
Fill->Routes::Vivod(Fill, loc, fn);
break;
case 4: // редактирование и просмотр свойств
system("cls");
Fill->Routes::Vivod(Fill, loc, fn);
do{
cout << "---
1.Edit
2.Write to file
3.Write to new file
4.Exiting the subprogram
---" << endl;
cout << ">> ";
cin >> x;cin.clear();cin.sync();
if (x==1){
system("cls");
Fill->Routes::Edit(Fill, loc, fn);}
else if (x==2){
system("cls");
Fill->Routes::Write(Fill, loc, fn);}
else if (x==3){
system("cls");
Fill->Routes::Save(Fill, loc, fn);}
else if (x==4){
system("cls");
break;}
else {system("cls"); cout << "---
Invalid input!
---" << endl;}}
while (true);
system("cls");
break;
case 5: // сортировка
system("cls");
Fill->Routes::Sort(Fill, loc, fn);
break;
case 6: // выход из программы
system("cls");
Fill->Routes::Write(Fill, loc, fn);
return 0;
default:
system("cls");
cout << "---
Error!
---" << endl;
break;}}}'
Ответ
вот так надо
void Init(int*& p, int i)
{
p = new int(i);
}
int main(int argc, char* argv[] )
{
int* p = nullptr;
Init(p, 1000);
return 0;
}
Комментариев нет:
Отправить комментарий