所謂“文件”是指一組相關數據的有序集合。這個數據集有一個名稱
叫做文件名。文件通常是駐留在外部介質上的,在使用的時候才調
入內存中。
就文件的分類,有很多種分類方式,在這里我們看一下文件編碼方式。
根據文件的編碼方式,文件可以分為ASCII碼文件和二進制文件。
ASCII文件也稱為文本文件,這種文件在磁盤中存放時每個字符對應一個
字節,用于存放對應的ASCII碼。例如,數字5678的存儲形式為:
ASCII碼: 00110101 00110110 00110111 00111000
十進制碼: 5 6 7 8
共占用4個字節。ASCII碼文件可在屏幕上按照字符顯示。
二進制文件是按照二進制的編碼方式來存放文件的。例如,數字5678的
存儲形式為00010110 00101110,只占兩個字節,二進制文件雖然可以在屏幕上顯示,但是其內容無法讀懂。C語言處理這些文件的時候,并不區分類型,都看成是字符流,按字節進行處理。
文件指針在C語言中用一個指針變量指向一個文件,這個指針稱為文件指針。通過文件指針就可對他所指的文件進行各種操作。定義文件指針的一般形式為”FILE “指針變量標識符。其中FILE應為大寫,他實際上是由系統定義的一個結構,該結構中含有文件名,文件狀態和文件當前位置等信息。在編寫源程序的時候,不必關心FILE結構的細節。例如”FILE fp”表示fp是指向FILE結構的指針變量,通過fp即可找到存放某個文件信息的結構變量,然后按照結構變量提供的信息找到該文件,實施對文件的操作。
在C語言中,文件操作都是由庫函數來完成的。文件操作主要有打開,讀寫和關閉等。
**1:文件打開函數fopen**
fopen函數用來打開一個文件,其調用的一般形式為:
文件指針名 = fopen(文件名,使用文件方式)
其中,“文件指針名”必須被說明為FILE類型的指針變量,“文件名”是被打開文件的文件名。
“使用文件方式”是指文件的類型和操作要求。“文件名”是字符串常量或字符串數組。
例如:
FILE fp;
fp = fopen(“file.a”,”r”);
//他的意思是在當前目錄下打開文件file.a,只允許進行“讀”操作,并且使得fp指向該文件
使用文件的方式一共有12種。

對于文件使用方式有以下幾點說明:
文件使用方式由r,w,a,t,b,+共6個字符組合成,各個字符的含義是:r(read)讀,w(write)寫,
a(append)追加,t(text)文本文件,可省略不寫;b(binary)二進制文件;”+”讀和寫
用r打開一個文件的時候,該文件必須已經存在,且只能從該文件讀出
用w打開的文件只能向文件中寫入,若打開的文件不存在,則以指定的文件名建立
該文件,如打開的文件已經存在,則將該文件刪去,從新建立一個文件
若要向一個已經存在的文件追加新的信息,只能用a方式打開文件。但此時該文件必須是
存在的,否則將會出錯。
在打開一個文件的時候,如果出錯,fopen將會返回一個空指針值NULL。在程序中可以
用這一信息來判別是否完成打開文件的工作,并做相應的處理。舉個例子:
if((fp=fopen(“file.a”,”rb”)) == NULL)
{
printf(“\nerror no open file.a!”);
getch();
exit(1);
}
**2:關閉文件**
調用的一般形式是:
fclose(文件指針);
正常完成關閉文件操作的時候,fclose函數返回值為0,如返回非零值則表示有錯誤發生
**3:文件讀寫函數**
在C語言中提供了很多文件讀寫的函數。字符讀寫函數fgetc和fputc;字符串讀寫函數fgets和
fputs;數據塊讀寫函數fread和fwrite;格式化讀寫函數fscanf和fprintf;這些函數
都包含在stdio.h頭文件中。
**(1):讀字符函數fgetc**
fgetc函數的功能是從指定的文件中讀取一個字符,函數的調用形式為:
字符變量 = fgetc(文件指針);
注意文件指針和文件內部的位置指針是不同的。文件指針是指向整個文件的,
需要在程序中定義說明,只要不重新賦值,文件指針的值是不變的。文件內部的
位置指針用以指示文件內部的當前讀寫位置,每讀寫一次,該指針均向后移動,
他不需要在程序中定義說明,而是由系統自動設置的。
**(2):寫字符函數fputc**
fputc函數的功能是把一個字符寫入指定的文件中,函數的調用形式為:
fputc(字符,文件指針);
fputc函數有一個返回值,如果寫入成功,則返回寫入的字符,否則返回EOF
**(3):字符串讀寫函數fgets和fputs**
讀字符串函數fgets函數的功能是從指定的文件中讀一個字符串到字符數組中,
函數的調用形式為:
fgets(字符數組名,n,文件指針);
其中n是一個正整數,表示從文件中讀出的字符串不超過n-1個字符,在讀入的最后
一個字符加上串結束標識’\0’。對fgets函數有兩點說明:在讀出n-1個字符之前,如果
遇到了換行符或者是EOF,則結束操作。fgets函數也有返回值,其返回值是字符數組的首
地址。
寫字符串函數調用形式:
fputs(字符串,文件指針);
**(4):塊數據讀寫函數fread和fwrite**
調用形式:
fread(buffer,size,count,fp);
fwrite(buffer,size,count,fp);
buffer是一個指針,在fread中,他表示存放輸入數據的首地址。在fwrite中,
他表示存放輸出數據的首地址。size表示數據塊的字節數,count表示要讀寫的
數據塊的塊數。
**(5)格式化讀寫函數fcanf和fprintf**
調用形式:
fcanf(文件指針,格式字符串,輸入表列);
fprintf(文件指針,格式字符串,輸出表列);
下面就是我們這個實例的要求:
~~~
編寫統計文件的字符數的程序,主要學習文件的概念
和文件操作等內容。
~~~
下面是我的代碼實現:
~~~
#include <stdio.h>
#include <stdlib.h>
/**
* 編寫統計文件的字符數的程序,主要學習文件的概念
* 和文件操作等內容。
*/
int main()
{
/**保存字符個數 **/
int count = 0;
/**保存文件名 **/
char fname[80];
/**文件指針 **/
FILE *fp;
printf("Please enter the file name:");
scanf("%s",fname);
if((fp = fopen(fname,"r")) == NULL){
printf("Open file failed!!\n");
exit(1);
}
count = 0;
while(fgetc(fp) != EOF)
count++;
fclose(fp);
printf("There are %d characters in file %s.\n",count,fname);
return 0;
}
~~~
下面是我的測試用例(名稱為test.txt):
~~~
cnuidocncn cwncviow
wedcvnwicvmnw
dcvnwidcvn
cvwiovm
wvcewoivm
w
evcovw
vcmweiocvmw
mvciomvw
nvi] v
wevmovjov
wvjkvnivpvm
wvciwmvw
'nvoikvv
nvwvmje
ewevvvv
wvwkvnpowiehf]ewnveiowv
~~~
好了,最后看一下我的運行過程:

除此之外,我們還可以對文件進行隨機讀寫。在C中提供了一些文件定位的函數,我們常用的有兩個:rewind和fseek。
這兩個函數的調用形式分別為:
rewind(文件指針)。
他的功能是把文件內部的位置指針移到文件首。
fseek(文件指針,位移量,起始點);
將文件內部位置指針移動到我們想要的位置。
- 前言
- 實例一:HelloWorld
- scanf函數學習
- 實數比較
- sizeof()保留字獲取類型的大小
- 自增/自減學習
- C學習if條件判斷和for循環
- C實現的九九乘法表
- C實現一個比較簡單的猜數游戲
- 使用C模擬ATM練習switch..case用法
- 記錄一個班級的成績練習一維數組
- C數組實現矩陣的轉置
- C二維數組練習
- 利用數組求前n個質數
- C實現萬年歷
- C實現數組中元素的排序
- C實現任意進制數的轉化
- C判斷一個正整數n的d進制數是否是回文數
- C使用遞歸實現前N個元素的和
- 鋼材切割問題
- 使用指針比較整型數據的大小
- 指向數組的指針
- 尋找指定元素
- 尋找相同元素的指針
- 整數轉換成羅馬數字
- 字符替換
- 從鍵盤讀入實數
- C實現字符行排版
- C實現字符排列
- C實例--判斷一個字符串是否是回文數
- 通訊錄的輸入輸出
- 撲克牌的結構定義
- 使用“結構”統計學生成績
- 報數游戲
- 模擬社會關系
- 統計文件中字符個數
- C實現兩個文件的內容輸出到同一個屏幕