首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C Primer Plus 學習筆記:第十三章 文件輸入輸出

     編輯:關於C語言

第十三章 文件輸入/輸出

13.1 與文件通信

13.1.1 文件本質

磁盤上一段命名的存儲區。C 視文件為連續字節序列,每字節可單獨讀取。ANSI C 提供兩種視圖:文本視圖(行尾轉換)與二進制視圖(字節無轉換)。

13.1.2 I/O 級別

  • 低級 I/O:調用系統調用,不可移植。
  • 標準高級 I/O:stdio.h 標準庫,可移植,功能豐富,帶緩衝提高傳輸率。ANSI C 僅保證支持標準 I/O。

13.1.3 標準文件

程序啟動自動打開三個流:標準輸入 (stdin)、標準輸出 (stdout)、標準錯誤 (stderr)。

13.2 標準 I/O 核心函數

13.2.1 命令行參數與 exit()

  • argc 檢查參數個數,argv[0] 為程序名。
  • exit(0) 正常退出,exit(EXIT_FAILURE) 異常退出。關閉所有打開文件。
  • 初始 main() 中 return 與 exit() 效果同;遞歸 main() 中 return 僅返回上一級,exit() 直接終止進程。

13.2.2 fopen() 打開文件

FILE *fp = fopen("filename", "mode"); // mode: "r", "w", "a", "rb", "wb" 等

失敗返回 NULL,必須檢查。

13.2.3 getc() / putc() 字符 I/O

ch = getc(fp);
putc(ch, fpout);
putc(ch, stdout); // 等價 putchar(ch)

13.2.4 文件結尾檢測

while ((ch = getc(fp)) != EOF) 或 fgetc() 返回 EOF 判斷。

13.2.5 fclose() 關閉文件

刷新緩衝區,釋放資源。程序正常結束會自動關閉,但良習顯式調用。

13.3 格式化與行式文件 I/O

13.3.1 fprintf() / fscanf()

對文件操作的 printf/scanf 版本,首參為 FILE*。rewind(fp) 將文件位置指針移回開頭。

13.3.2 fgets() / fputs()

  • fgets(buf, MAX, fp):讀取一行(含 \n)或 MAX-1 字符或至 EOF,末尾自動加 \0 成字串。注意:MAX 包含結束符空間。
  • fputs(buf, fp):寫入字串(不自動加 \n)。

13.3.3 gets() vs fgets()

gets() 不檢查緩衝區大小,極易溢出,已被 C11 移除,嚴禁使用。永遠用 fgets()。

13.4 隨機訪問:fseek() / ftell()

fseek(fp, offset, whence); // whence: SEEK_SET(開頭), SEEK_CUR(當前), SEEK_END(結尾)
long pos = ftell(fp);      // 返回距文件開頭字節數
  • offset 為 long,可正(前移)、負(後移)、零。
  • 成功返回 0,失敗 -1。
  • ftell() 返回 long 位置,首字節位置為 0。

13.5 標準 I/O 內幕:緩衝區機制

  1. fopen() 打開文件、建立緩衝區、創建管理結構體 (FILE 結構)。
  2. 輸入函數:從文件塊讀入緩衝區。
  3. 輸出函數:寫入緩衝區,滿時刷新至文件。

13.6 其他標準 I/O 函數

  • ungetc(c, fp):將字符推回輸入流,下次讀取先得到它。每次調用只能推回一字符。
  • fflush(fp):強制刷新輸出緩衝區。fp=NULL 刷新所有輸出流。
  • setvbuf(fp, buf, mode, size):自定義緩衝區。mode:_IOFBF全緩衝、_IOLBF行緩衝、_IONBF無緩衝。需在無操作前調用。
  • 二進制 I/O:fread(ptr, size, count, fp)、fwrite(ptr, size, count, fp)。按塊讀寫,保持內存位模式。適用結構體/數組批量存取。
    例:fwrite(buffer, 256, 1, fp) 寫 256 字節塊;fwrite(arr, sizeof(double), 10, fp) 寫 10 個 double。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved