首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C++ ofstream 寫文件不生效:錯誤使用 eof() 判斷輸出流

     編輯:程式設計綜合問答

錯誤代碼

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,但這不是問題核心;真正問題是:

  1. 若文件打開失敗,outfile 進入失效狀態,後續寫入靜默失敗。
  2. 缺少分隔符,導致數據粘連無法解析。
  3. 未檢查流狀態 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)磁盤滿/權限等錯誤可感知

調試建議

  1. 在 IDE 設置斷點,觀察 outfile 狀態位 (rdstate())。
  2. 運行後用十六進制編輯器查看 place.txt 確認數據格式。
  3. 大數據量時考慮 ostringstream 組裝後一次性寫入,減少系統調用。

補充:二進制寫入結構體

outfile.write(reinterpret_cast(&p[i]), sizeof(NodeType));

需確保結構體無虛函數、無指針成員,且編譯器對齊一致 (跨平台需注意)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved