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

C語言文件I/O完整指南:從基礎到進階

     編輯:關於C語言

前言

本文深入探討 C 語言文件輸入輸出(I/O)機制,參考經典教材《C Primer Plus》(第 5 版與第 6 版)編寫。內容涵蓋文件基本概念、文本與二進制模式、標準流重定向、核心庫函數用法,以及實戰代碼示例。部分內容涉及 MS-DOS 環境操作,讀者可按需閱讀。

一、C 語言文件基礎知識

1. 文件分類與存儲本質

文件本質上是磁盤或固態硬盤上一段已命名的存儲區域,所有內容均以二進制形式保存。根據數據組織方式,文件分為兩大類:

文件格式定義保存內容典型示例
文本文件以二進制編碼字符(如 ASCII、Unicode)表示文本的文件文本內容.txt、.c、.h
二進制文件二進制值直接代表機器指令或數值數據的文件二進制內容圖片、可執行文件、.dat

2. 文本模式與二進制模式的差異

C 語言提供兩種訪問文件的途徑:文本模式與二進制模式。

  • 文本模式:針對文本文件,C 庫函數會自動處理不同作業系統的換行符差異。例如:UNIX/Linux 使用 \n、早期 MS-DOS/Windows 使用 \r\n、舊版 Mac OS 使用 \r。以文本模式打開時,C 運行庫會在讀寫時自動轉換(如將 \r\n 轉為 \n),屏蔽平台差異。
  • 二進制模式:程序直接訪問文件每一個字節,不做任何轉換。若需處理文本文件,程序員必須自行根據作業系統特性處理換行符。

文件結尾由宏 EOF(End of File)標識,值通常為 -1。

3. 三個標準流

C 程序啟動時自動打開三個標準流:

流名稱默認設備C 語言標識符
標準輸入鍵盤stdin
標準輸出顯示器stdout
標準錯誤輸出顯示器stderr

可通過重定向改變這些流的默認設備關聯。

二、MS-DOS 重定向實戰

重定向運算符 <(輸入)、>(輸出)可將文件與標準流關聯。例如:

insort.exe < defin.txt > defout.txt

上述命令將 defin.txt 內容作為程序輸入,將程序輸出寫入 defout.txt。但需注意:

  • 重定向輸入後,stdin 不再關聯鍵盤,若程序末尾有 getch() 等待按鍵,在純 DOS 環境下會導致程序掛起。
  • 重定向輸出時,原輸出到螢幕的內容將寫入文件,無法即時查看。
  • 不能同時重定向多個輸入/輸出文件,且輸出重定向會覆蓋目標文件原有內容。
  • 被重定向的文件必須包含 EOF 標記。

目錄文件列表 defin.txt 內容 重定向輸入執行 重定向輸出執行 defout.txt 內容 組合重定向

三、文件打開與關閉:fopen() 與 fclose()

相比重定向,在代碼中直接操作文件更靈活、安全。核心流程:

FILE *fp = fopen("file1.txt", "r");  // 以只讀文本模式打開
if (fp == NULL) exit(EXIT_FAILURE);  // 檢查打開是否成功

// ... 文件操作 ...

if (fclose(fp) != 0) exit(EXIT_FAILURE); // 關閉並檢查狀態

常用打開模式

fopen 模式表

C11 新增 x 模式(獨佔創建),此處不展開。同動態內存分配一樣,務必檢查返回值,並在操作結束後及時關閉文件;異常情況(如硬盤故障)下關閉失敗亦需處理。

四、文本模式文件 I/O

1. 單字符操作:getc() / putc()

類比 getchar()/putchar(),但需指定文件指針:

int ch = getc(fp);       // 從 fp 讀取一字符,返回 int 以容納 EOF
putc(ch, fpout);         // 將字符 ch 寫入 fpout 指向的文件

注意:返回值為 int 而非 char,為了正確判斷 EOF;getc/putc 可能是宏實現,參數不能有副作用(如 getc(fp++) 非法)。

getc 宏定義 putc 宏定義

2. 格式化 I/O:fprintf() / fscanf()

在 printf/scanf 基礎上增加文件指針參數:

fprintf(fp, "Hello World");  // 寫入文件
fscanf(fp, "%s", str);       // 從文件讀取

數據流向示意 示例代碼1 示例代碼2 示例代碼3

3. 字符串 I/O:fgets() / fputs()

fgets(str, SIZE, fp);  // 讀取 SIZE-1 字符或遇到 \n 結束,保留 \n
fputs(str, fp);        // 寫入字符串,不自動添加 \n

五、二進制模式文件 I/O

1. 文件定位:fseek() / ftell()

前提:必須以二進制模式打開文件,否則位置計算無意義。

  • ftell(fp):返回長整型,表示當前位置距文件開頭的字節數。
  • fseek(fp, offset, origin):移動文件位置指針。
    • offset:偏移量(長整型),負值向文件開頭偏移。
    • origin:起點模式 —— SEEK_SET(文件開頭)、SEEK_CUR(當前位置)、SEEK_END(文件結尾)。

ftell 示意 fseek 模式 定位示例1 定位示例2

2. 二進制塊讀寫:fread() / fwrite()

以相同位格式存儲數值,保持最大精度(如 double 類型)。

// 寫入 double 值 1.0/3.0
FILE *fp = fopen("pro.dat", "wb");
double num = 1.0 / 3.0;
fwrite(&num, sizeof(double), 1, fp);
fclose(fp);

// 讀取並驗證精度
fp = fopen("pro.dat", "rb");
double get;
fread(&get, sizeof(double), 1, fp);
fclose(fp);
printf("get * 3.0 = %lf", get * 3.0); // 輸出接近 1.0

pro.dat 文件屬性 運行結果

六、總結與附錄

本文系統梳理了:

  • 文件基本概念與分類
  • MS-DOS 重定向操作及其風險
  • fopen()/fclose() 及模式選擇
  • 文本模式 I/O:getc/putc、fprintf/fscanf、fgets/fputs
  • 文件定位:fseek/ftell
  • 二進制模式 I/O:fread/fwrite

附錄:其他標準 I/O 函數速查

附錄1 附錄2 附錄3 附錄4 附錄5 附錄6

建議配合《C Primer Plus》第 5 或 6 版深入學習。文中難免疏漏,歡迎指正交流。

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