1. 程式人生 > >Linux檔案和I/O

Linux檔案和I/O

Linux檔案和I/O

檔案基礎

檔案即一組相關資料的有序集合。

檔案型別

  • 常規檔案 r
  • 目錄檔案(資料夾) d (directory)
  • 字元裝置檔案 c (char) 代表一個字元裝置
  • 塊裝置檔案 b (block)
  • 管道檔案 p 程序間通訊的一種機制
  • 套接字檔案 s 程序間通訊和網路通訊的一種機制
  • 符號連結檔案 l (link) 相當於windows的快捷方式

在linnux中,操作裝置也就是操作相關檔案。

標準I/O

標準I/O也就是C庫 提供的一組操作操作標準I/O的函式。實用方便,可移植性高。
其內部實現了緩衝機制減少了系統呼叫。

系統呼叫

裸機程式設計時(無作業系統)程式碼直接通過修改暫存器和硬體打交道。在linux作業系統中,由於一般會同時執行多個應用程式,直接訪問硬體可能會導致系統硬體之間的衝突,比如 兩個應用程式在同一時刻都要訪問蜂鳴器,這是就會產生衝突,於是乎需要OS來調節衝突,所以應用層程式碼不直接和硬體打交道,而是通過一套系統函式介面和硬體打交道。這樣就可以保證系統的安全。這就是系統呼叫。
不同的作業系統有不同的介面,所以不同平臺的程式碼往往不通用。

緩衝機制

舉例:無緩衝:應用程式在每次需要磁碟資料時,每次都需要通過系統呼叫去訪問磁碟。
有緩衝:應用程式去讀磁碟時,比如需要10個數據,系統有可能會將100個甚至更多資料放在系統自動開闢的緩衝區中,在程式下一次需要訪問磁碟讀資料時就不需要再經過系統呼叫了。在向磁碟寫入資料時,只有當緩衝區寫滿了,才會通過系統呼叫向磁碟寫資料。
這樣就提高了系統的效率。

即FILE結構體,一個FILE結構體代表一個開啟的檔案。標準I/O操作都圍繞流來展開。
linux中為二進位制流 :一個換行就是一個 \n

緩衝型別

全緩衝

參考緩衝機制。

行緩衝

遇見一個\n或者緩衝區滿才會輸出到I/O裝置。

無緩衝

直接輸入輸出。

當我們開啟一個檔案時,系統自動打開了三個流:分別是標準輸入流,標準輸出流,標準錯誤流。每個流代表一種檔案描述符。

開啟流


 #include <stdio.h> //需要的標頭檔案
       FILE *fopen(const char *path, const char *mode);

引數:path

檔案絕對路徑。

引數:mode

參考man手冊: man 3 fopen
The argument mode points to a string beginning with one of the follow‐
ing sequences (Additional characters may follow these sequences.):

   r      Open  text  file  for  reading.  The stream is positioned at the
          beginning of the file.

   r+     Open for reading and writing.  The stream is positioned  at  the
          beginning of the file.

   w      Truncate  file  to  zero length or create text file for writing.
          The stream is positioned at the beginning of the file.

   w+     Open for reading and writing.  The file is created  if  it  does
          not  exist, otherwise it is truncated.  The stream is positioned
          at the beginning of the file.

   a      Open for appending (writing at end of file).  The file  is  cre‐
          ated  if it does not exist.  The stream is positioned at the end
          of the file.

   a+     Open for reading and appending (writing at end  of  file).   The
          file is created if it does not exist.  The initial file position
          for reading is at the beginning  of  the  file,  but  output  is
          always appended to the end of the file.

關閉流

流後使用要及時關閉。當關閉流時會自動重新整理緩衝區中的資料並釋放緩衝區。
流關閉後不能進行任何操作,否則將導致不可預知的後果。

 #include <stdio.h>
 int fclose(FILE *fp);

fp為開啟檔案返回的FILE* 。

利用標準I/O拷貝檔案舉例

程式碼裡含有詳細註釋。
實現方法為 :以只讀方式開啟原始檔,以寫入方式開啟目標檔案,若沒有目標檔案將會自動建立。然後利用fgetc從原始檔中將字元挨個讀出,用fputc寫入目標檔案,知道檔案末尾。

#include <stdio.h>
int main(int argc ,char *argv[])
{
	FILE *fps,*fpd; //定義原始檔和目標檔案結構體
	int ch;
	if(argc<3)
	{
		printf("Usage: %s <dst_file> <src_file>\n",argv[0]);
		return -1;
	}

	if((fpd = fopen(argv[1],"w"))==NULL) //以可寫方式開啟檔案或新建檔案
	{
		perror("open file faild!\n");
		return -1;
	}
	if((fps = fopen(argv[2],"r"))==NULL)//以只讀方式開啟檔案
	{
		perror("open src_file faild!\n");
		return -1;
	}
	while( (ch = fgetc(fps)) != EOF)//檔案末尾將會返回EOF 
	{
		fputc(ch,fpd);//輸出到目標檔案
	}
	fclose(fps);//操作完檔案後馬上關閉
	fclose(fpd);
return 0;
}