程序顯示菜單,輸入選項後執行一次功能即退出,無法連續操作。
main()執行完畢進程即結束。菜單邏輯需包裹在 無限循環 中,直到用戶選擇「退出」才break。
int main() {
// 初始化:讀取文件、構建數據結構
RDatabase readerDB;
BDatabase bookDB;
while (true) { // ← 關鍵:主循環
printMainMenu();
char choice = getUserChoice();
switch (choice) {
case '1': handleBorrowReturn(readerDB, bookDB); break;
case '2': bookDB.bookdata(); break; // 圖書管理子菜單 (內部也需循環)
case '3': readerDB.readerdata(); break; // 借閱者管理子菜單
case '0':
cout << "謝謝使用,再見!\n";
return 0; // 正常退出
default:
cout << "輸入錯誤,請重新輸入。\n";
}
}
}
void RDatabase::readerdata() {
while (true) { // 子菜單循環
printReaderMenu();
char choice = getUserChoice();
switch (choice) {
case '1': addReader(); break;
case '2': modifyReader(); break;
case '3': deleteReader(); break;
case '4': queryReader(); break;
case '0': return; // 返回上級菜單
default: cout << "輸入錯誤\n";
}
}
}
| 問題 | 修正 |
|---|---|
| 主菜單執行一次退出 | while(true) 包裹主菜單 |
| 子菜單執行一次退出 | 每個 xxxdata() 內部 while(true) |
cin >> choice 留下換行符干擾後續輸入 |
讀取後 cin.ignore(numeric_limits |
| 文件讀寫模式錯誤 | fstream file("xxx", ios::in | ios::binary) 讀,ios::out | ios::binary | ios::trunc 寫 |
結構體含指針/STL 容器直接 file.write((char*)&obj, sizeof(obj)) |
**嚴重錯誤**:需序列化 (逐字段寫入) 或用文本/JSON 格式 |
見 codepad.org/XAeNGCSO (含序列化修正、輸入緩衝處理、主/子循環完整結構)。
控制台交互程序**必須有主循環**,子功能同理。C++ 結構體持久化不能直接二進制寫入含動態內存的對象,需實現序列化邏輯。