bool Graph::OutputV() {
ofstream outfile("place.txt");
for (int i = 0; i < 21 && (!outfile.eof()); i++) { // 錯誤:輸出流不適用 eof()
outfile << p[i].sight << p[i].descri << p[i].heat;
}
outfile.close();
return true;
}
eof() 是**輸入流**狀態標誌,表示「讀取到達文件末尾」。**輸出流 (ofstream) 沒有 eof 概念**,寫入操作不會設置 eofbit。循環條件 !outfile.eof() 恒為 true,但這不是問題核心;真正問題是:
outfile 進入失效狀態,後續寫入靜默失敗。outfile.good() 或 outfile.is_open()。bool Graph::OutputV() {
ofstream outfile("place.txt");
if (!outfile.is_open()) {
cerr << "無法打開文件 place.txt" << endl;
return false;
}
for (int i = 0; i < 21; ++i) {
outfile << p[i].sight << ' ' // 添加分隔符
<< p[i].descri << ' '
<< p[i].heat;
if (i != 20) outfile << '\n'; // 每行換行
if (!outfile) { // 檢查寫入狀態
cerr << "第 " << i << " 行寫入失敗" << endl;
return false;
}
}
outfile.close();
return true;
}
| 原代碼 | 修正 | 原因 |
|---|---|---|
!outfile.eof() | 移除 | 輸出流無 eof |
| 無分隔符 | << ' ' << '\n' | 數據可解析 |
| 無打開檢查 | is_open() | 失敗快速返回 |
| 無寫入狀態檢查 | if (!outfile) | 磁盤滿/權限等錯誤可感知 |
outfile 狀態位 (rdstate())。place.txt 確認數據格式。ostringstream 組裝後一次性寫入,減少系統調用。outfile.write(reinterpret_cast(&p[i]), sizeof(NodeType));
需確保結構體無虛函數、無指針成員,且編譯器對齊一致 (跨平台需注意)。