Introduction

Overview

在我們用 fopen() 開啟一個檔案時,我們會得到一個 file pointer,這個 file pointer 會指向一個 FILE object,FILE object 描述了一個 stream,根據我們打開檔案的方式,我們可以從 stream 中讀資料或是往其中寫資料

stream 是一個抽象概念,他連接著 file 亦或是 device,而因為 stream 這個抽象概念的存在,我們可以不用考慮 stream 的對面是一個 device 亦或者一個 file,而可以用 stream 這個統一的概念理解

Unbuffered I/O vs. Buffered I/O

Unbuffered IO 中,我們提到如果我們想要存取資料進行 Disk I/O 時,都需要轉換成 kernel mode,而這個過程是很耗費時間的

因此在 Buffered I/O 中,我們在 Ubuffered I/O 外面放了一層 buffer,這層 buffer 的作用和 Buffer Cache 類似,但不同的是,這個 buffer 是放在 user space 的,意思是當我們要存取暫放在 buffer 的資料時,不需要轉換成 kernel mode,大大提升了資料存取效率

在 buffer I/O 中,我們會用 stream 這個抽象概念來描述 user space 中的 buffer

How it works?

假設我們要從文件中讀取 hello world! 這個字串

在第一次存取時,我們想要讀取 h 這個字母,而因為此時 stream 還沒有內容,所以我們依然要遵照 unbuffered I/O 中提到的一樣進行 Disk I/O

但不一樣的是,除了 h 這個字母,我們還會將整個 hello world! 字串帶回 user space 並存放在 stream 中,這樣我們在之後進行存取操作時,都不需要再次進入 kernel mode 了


Buffering

fopen, freopen, fdopen, fileno, fclose

Buffering

Positioning a Stream

Reading & Writing

Unformatted I/O

Formatted I/O

Input Functions:

int scanf(const char *format,);
int fscanf(FILE *fp, const char *format,);
int sscanf(char *buf, const char *format,);

Output Functions:

int printf(const char *format,);
int fprintf(FILE *fp, const char *format,);
int sprintf(char *buf, const char *format,);
int vprintf(const char *format, va_list arg);
int vfprintf(FILE *fp, const char *format, va_list arg);
int vsprintf(char *buf, const char *format, va_list arg);

懶得做筆記了 zzz…

Error Checking

Binary I/O

Interleaved Read/Write