11.14.2015

Linux File I/O 心得

這一陣子,整理了很多有關於在Linux下的檔案I/O處理的函式。這些函式很多都是以前在學生時代就已經接觸過的,工作之後,常用到的永遠都那幾個,理所當然地不會忘記;而不常用的,也自然而然地忘記。或者是說,以前學習的時後,課本教啥就記啥,但不會去思考「這些函式的功能都這麼類似,是不是其中應該有什麼差異??」

想再寫一文章,把這些函式的差異整理一下。這些函式,主要分成以下7類:

1. fread() / fwrite();
2. read() / write();
3. fgets() / fputs();
4. fgetc() / fputc();
5. gets() / puts();
6. getc() / putc();
7. getchar() / putchar();

1. fopen(), fclose(), fread(), fwrite(), fseek(), ftell(), rewind()等等是屬於高階的I/O,主要是應用在Linux系統對於檔案 (File)之間的存取,可以是二進制檔 (Binary File),也可以是純文字檔 (Text File)。而fread(), fwrite()本身並沒有換行字元 ('\n')的概念,所要抓取資料的大小,則是依sizeof(DataType) * SIZE而定。fseek()可以調整Position在檔案之中的位置,ftell()會回傳Position在檔案中的那一個位置。

2. open(), close(), read(), write(), lseek()等是屬於Linux系統中的低階I/O,主要是應用在Linux系統程序間的調適,例如像Socket Programming, Driver Programming等等。當然也是可以應用在對一般檔案 (File)的存取;但我們會選擇使用'f'開頭的系列函式。

3. 假如我們對於一個檔案,要以「」為單位進行讀取的動作,我們會選擇使用fgets()和fputs();假如是要以「字元」為單位,我們會選擇使用fgetc()和fputc()。

4. fgets(), fputs()和gets(), puts()這兩組函式的差異,我們再復習一下:
    a). fgets()的第3個參數,除了可以從檔案 (FILE *fp)讀取之外,也可以從標準輸入 (stdin)讀取,例如:鍵盤;而gets()僅能從標準輸入讀取資料;
    b). fputs()的第2個參數,除了可以輸出至檔案 (FILE *fp)之外,還可以輸出至標準輸出 (stdout),例如:螢幕;而puts()僅能做標準輸出;
    c). fgets()的第2個參數可以確保使用者所輸入的字串大小,防止OverFlow的問題;
    d). fgets()會多送一個換行字元 ('\n');而fputs()則不會;
    e). gets()不會送換行字元 ('\n');而puts()則會。

5. fgetc(), fputc()和getc(), putc()在使用方法上完全一模一樣,它們的差異是在於較底層的運作:后者是屬於巨集定義,前者是屬於函式呼叫。而巨集定義的getc()和putc()在執行速度上,要比函式呼叫的fgetc()和fputc()要來得快。

6. 相較於fgetc(), fputc(), getc(), putc(),getchar()和putchar()就僅能從標準輸入 (stdin)標準輸出 (stdout)做IO的行為;而前面4個還可以透過檔案指標 (FILE *)來對檔案做IO。

相關文章:
1. Linux C fopen(), fclose(), fread(), fwrite(), fseek(), ftell(), rewind()
2. Linux C fgets(), fputs(), foef(), ferror()
3. Linux C fgetc(), fputc()
4. Linux C gets(), puts()
5. Linux C getc(), putc()
6. Linux C getchar(), putchar()
7. Linux C open(), close(), read(), write(), lseek()

沒有留言:

張貼留言