io操作是我們程式執行的基礎,資料在程式執行結束時需要儲存就必須使用io操作。io主要包括兩類:標準io與系統io
一 標準io
標準io是為了避免跨平台移植引起的不必要異常,指定的一系列標準函式,無論linux、windows都可以使用。
標準io常用api包括:
fopen、fwrite、fread、fclose、prinf、fprintf、fget、fput
等均是以f開頭。
其中:
fopen的mode
r/r+ 是不建立檔案,前者唯讀,後者可讀寫、
w/w+ 能建立檔案,並且把檔案置空,前者只寫,後者可讀寫
a/a+ 能建立檔案,但不置空檔案,在檔案末尾寫,前者只寫,後者可讀寫
fputc、fgetc;逐個位元組讀寫
fputs、fgets;定義緩衝區,緩衝區填滿後操作。整行讀取
fwrite、fread。以位元組位計算長度,按照指定的長度和次數讀取資料,遇到結尾或完成指定長度讀取後停止。
通常標準io伴隨著file結構體。
二 系統呼叫io
系統呼叫io是標準io的底層實現,通常受制於所存在的作業系統環境。
系統呼叫io常用api包括:
open、close、read、write、lseek
系統呼叫io通常伴隨乙個檔案描述符,是個整型數。通常使用ulimit -n檢視。檔案描述符是檔案指標在乙個指標陣列中的下標索引位置。該指標陣列存在於當前程序的位址空間檔案描述符優先使用當前範圍最小的。
三 io效率比較
#include#include#include#includevoid fgetcandfputc()
fputc(ch, write);
}fclose(write);
fclose(read);
return;
}void fgetsandfputs(int size)
fclose(write);
fclose(read);
puts("ok!");
exit(0);
}void freadandfwrite(int size)
fclose(write);
fclose(read);
puts("ok!");
exit(0);
}void removeline(int line)
int main (int argc, char *ar**)
io效率依賴於buffer_size大小。
實驗結果如下,複製乙個7030556行162mb大小的檔案。
buffer_size18
1024
10240
time
15.1
2.51.2
1.2由此可見buffer_size並非是越大越好,當超過一定閾值時到達系統瓶頸,同樣無法提高io效率
檔案系統程式設計 標準I O庫
printf函式向標準輸出寫入多個字元,所寫入的字元被放在乙個使用者態的緩衝區中,直到碰到乙個換行符,系統才呼叫write函式將緩衝區中的資料寫入標準輸出,也就是說,在換行符之前寫入的字元並不會立即出現在控制台螢幕上。系統呼叫要請求核心的服務,會引發cpu模式的切換,期間會有大量的堆疊資料儲存操作,...
unix系統之與檔案系統相關的系統呼叫
自unix誕生之初,檔案系統便成為了unix系統的一部分。儘管那時的檔案系統只能支援512k位元組的磁碟且每個檔案限定長度為64k位元組。但是檔案系統的基礎結構已經基本確定。構建在檔案系統之上的相關的系統呼叫也已基本成型。後來發展的與檔案系統相關的系統呼叫也是在其基礎之上不斷完善而來的。unix中與...
系統IO與標準IO
第十章的學習中,我們學習了open,close,read,lseek,statu函式以及理解了共享檔案的定義,下面通過對一些例子的分析來進一步了解第十章學習的內容。例1 ffiles1.c int main int argc,char ar 該例的執行結果為 分析 在該例中,首先開啟了同乙個檔案3次...