ここに質問する人がいないので、ここで誰かが何が起こっているか知ってくれることを願っています。ダイナミックアレイからデータを削除する際の例外
私はアドレスブックプロジェクトに取り組んでいます。主な前提は、動的配列を使用してレコードを格納し、テキストファイルを単にデータベースとして使用することです。 クラスRecord
は名前、姓、番地、住宅番号などのデータで構成されています。レコードはクラスAdressBook
の動的配列に格納されます。アプリケーションには、終了編集レコードの表示、追加、検索、削除などの機能が必要です。プログラムが起動すると、.txtファイルからのデータが配列にロードされ、プログラムが終了すると、配列からテキストファイルにすべてのオブジェクトが保存されます。これは私のAdressBookクラスです:
class AdressBook
{
int tableCap_;
Record *recordTable_;
int recordNum_;
public:
AdressBook();
int getTableCap();
bool addRecord(const Record& newRecord);
Record getRecord(int);
void deleteRecord();
void searchRecord();
bool readFromFile();
bool saveToFile();
}
私は、ショーを作っ追加し、検索機能が、私はレコードを削除した後、アレイでの作業に問題があります。レコードはこの方法で正しく削除されています:
void AdressBook::deleteRecord()
{
// some code where i search record to delete
Record *tempTable = new Record[tableCap_ - 1];
for (int j = 0; j < i; j++)
tempTable[j] = recordTable_[j];
for (int j = i; j < tableCap_ - 1; j++)
tempTable[j] = recordTable_[j+1];
delete[] recordTable_;
recordTable_ = tempTable;
recordNum_--;
}
私が言ったように。レコードを削除するとうまくいきます。配列に対して何らかのアクションを再度実行したいときに問題が表示されます。たとえばsaveToFile
機能:
bool AdressBook::saveToFile()
{
ofstream ofs("save.txt", ios::out | ios::trunc);
for (int i = 0; i < getTableCap(); ++i)
{
ofs << recordTable_[i].name << endl;
ofs << recordTable_[i].surname << endl;
ofs << recordTable_[i].street << endl;
ofs << recordTable_[i].houseNumber << endl;
ofs << recordTable_[i].postalCode << endl;
ofs << recordTable_[i].city << endl;
}
return 1;
}
}
Recordクラスは:
class Record
{
public:
string name, surname, street, houseNumber, postalCode, city;
int classNumber;
Record(string, string, string, string, string, string);
Record();
~Record();
friend istream& operator>>(fstream&, Record& t);
};
これらの機能は、オブジェクトPhoneBook phoneBook
にmain.cpp
で呼び出されます。 ビジュアルスタジオが例外をスローするアクセス違反の読み取り場所。私はこれらの例外を投げるのを避けるために何を変えることができないのか分かりません。例外はレコードを削除した後にスローされます。あなたのsaveToFile
機能で
なぜベクターを使用しないのですか? –
"これらの例外をスローするのを避けるために変更する"ことは、プログラムのメモリ破損の原因となるバグを見つけて修正することです。コードのどこかにバグがあり、その結果、未定義の動作と破損が発生し、コード内のその時点で現れます。ある特定のポイントでプログラムがクラッシュしたとしても、そのバグはどこにあるのか分かりません。バグはコード内のどこにでも置くことができます。あなたはそれを理解して修正する必要があります。 –
'recordNum_'と' tableCap_'の違いは何ですか? – 1201ProgramAlarm