天天看點

檔案操作 重點 盲區

*本文圖檔顯示的代碼中 fp 表示建立的檔案指針變量名*

檔案名

平常我們所說的檔案名就是我們在檔案夾或桌面見到的檔案名稱,如下圖,分别是圖檔檔案,markdown檔案和文本檔案和檔案主人取的名字;

檔案操作 重點 盲區

程式設計領域:在平常所說的檔案名前加上路徑。

如(C:\Users\王琳\Desktop\轉專業\大一\c語言.txt)

檔案概念

檔案是存放資料的一種媒介,存放在外存中。

其實有時候我們會把資訊(資料)輸出到磁盤上形成檔案,當需要的時候再從磁盤上把檔案中資料讀取到記憶體中使用,這裡處理的就是磁盤上檔案。

它是一種存儲在外部媒體上的資料的集合。

是以我們說檔案都是存儲在外存中的,當需要使用時從外存中拿取資料到記憶體或從記憶體中輸入資料到外存中;

資料傳輸路徑

如下圖所示,我們輸入資料一般從記憶體中,即程式資料區輸出到緩沖區,待緩沖區被資料充滿即存入外存;當從外存中讀入資料時,資料先從外存中 存入輸入緩沖區,等到緩沖區充滿再發送給程式資料區。

檔案操作 重點 盲區

緩沖區

之是以要存在緩沖區,主要有兩個原因:

  1. CPU的讀寫速度與硬碟不比對:由于CPU的讀寫速度遠高于硬碟,是以當程式進行讀寫操作時是需要等待的,

而當一個計算機的所有程式都需要等待硬碟時,大家的體驗就會很可怕,相信大家都被坐在電腦桌前幾十秒幾分鐘啥也不能幹的那種焦躁給支

配過。但是有了緩沖區,就可以将資料先放入緩沖區中,程式可以繼續向下執行而無需等待,等到緩沖區充滿了便将資料全部放入硬碟中,而

緩沖區又可以開始存入新一輪的資料。

  1. 減少操作硬體的次數

當我們寫入資料的時候,每寫入一次都要操作一次磁盤I/O,而硬碟的速度是非常慢的(相對于cpu),所有當有大量的小資料時,如果每次都

把這些資料放進磁盤,那每一次都要進行一次磁盤I/O操作,這就會很慢。是以把這些小資料存入緩沖區堆積着,等充滿,小資料變成大資料,

然後一次性I/O寫入磁盤,這樣就讓原本的無數次I/O簡化成了1次,大大的提高了效率。

檔案使用方式

(以下圖檔所涵蓋的檔案讀寫方式大家可自行前往各網站搜尋學習資源學習檔案操作方式,在此列出一些本人學習時得到的經驗):w或w+,wb

都是會覆寫,檔案的資料寫入都是覆寫式寫入,無論檔案是否存在,都會建立一個檔案,清空老檔案裡的資料。或者a+,讀寫方式打開檔案,寫入

資料總是寫入到檔案末尾,也叫追加寫,不會清空之前資料,也可用r+,打開的時候保留檔案原有内容。

檔案操作 重點 盲區

檔案操作的函數使用

像fgets這樣的函數(比如fputs)要注意檔案資料後是否有換行符跟随,如下圖 :

hello後面帶了一個換行符,用printf函數輸出在螢幕時結果将自動攜帶換行符。

檔案操作 重點 盲區

而像這樣:

檔案操作 重點 盲區

*對于其他函數大家可自行測試*

ssacanf,sprintf函數

作用:

  1. sscanf是從一個檔案中讀取格式化資料
  1. sprintf是把格式化的資料轉換成字元串存儲到一個檔案中

fseek函數

定義

根據檔案指針的位置和偏移量來定位檔案指針

使用方法

以下三者代表檔案指針起始位置的不同

以字元串為例: "abcdef" ,seek_set 就是從a開始作為起始位置,seek_end起始位置則是在f後面。

比如 *fseek ( fp , 2 , seek_set)*得到的結果就是c,而使用 fseek( fp , -2 , seek_end) 則是得到e

檔案操作 重點 盲區

ftell函數

定義

傳回檔案指針相對于起始位置的偏移量

使用方法

檔案操作 重點 盲區

rewind函數

作用

讓檔案指針的位置回到檔案的起始位置

void main( void )
{
   FILE *stream;
   int data1, data2;

   data1 = 1;
   data2 = -37;

   if( (stream = fopen( "rewind.out", "w+" )) != NULL )
   {
      fprintf( stream, "%d %d", data1, data2 );
      printf( "The values written are: %d and %d\n", data1, data2 );
      rewind( stream );
      fscanf( stream, "%d %d", &data1, &data2 );
      printf( "The values read are: %d and %d\n", data1, data2 );
      fclose( stream );
   }
}
      

strerror函數

傳回值是錯誤碼對應資訊的字元串位址,也即錯誤原因,和perror函數類似

使用方法
檔案操作 重點 盲區

perror

會列印對應的錯誤原因

檔案操作 重點 盲區

feof函數與ferror函數