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

C 語言 clearerr 與 fseek 實戰:讀寫模式切換的正確姿勢

     編輯:程式設計疑難解答

問題場景

以 "w" 模式打開文件 → fputs 寫入 → fgetc 讀取(觸發錯誤/EOF 標誌) → clearerr 清除標誌 → 再次 fputs。能否成功?

核心分析

  • "w" 模式只能寫入,fgetc 讀取會失敗,設置錯誤標誌,文件指針後移 1 字節(未定義行為)。
  • clearerr 僅清除錯誤/EOF 標誌,不改變文件指針位置。
  • 後續 fputs 會從當前指針位置寫入,導致數據錯位或覆蓋。

正確代碼:必須配合 fseek

void main() {
    FILE *pf = fopen("F:\\1.txt", "w+"); // 必須用 w+/r+/a+ 支持讀寫
    if (!pf) return;
    fputs("jhhhbjuh", pf);   // 寫入
    char ch = fgetc(pf);     // 讀取(指針後移 1)
    clearerr(pf);            // 清除錯誤標誌
    fseek(pf, -1, SEEK_CUR); // 關鍵:指針回退 1 字節
    fputs("asdffffff", pf);  // 正確位置追加
    fclose(pf);
}

關鍵點總結

  1. 模式選擇:需讀寫切換請用 w+、r+、a+,單純 w/r/a 不支持雙向操作。
  2. 指針管理:任何讀寫切換前,務必用 fseek/rewind/fsetpos 定位指針。
  3. clearerr 作用:僅清除標誌位,不影響指針、緩衝區、文件描述符。
  4. 緩衝區刷新:切換前建議 fflush(pf) 確保數據落盤。

補充:標準規定

C 標準規定:在更新流(+ 模式)中,輸入操作後進行輸出操作,或反之,必須中間插入文件定位函數(fseek 等)或 fflush,否則行為未定義。

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