與緩衝密切相關的文件流

文件流的定義來源於水,數據就像水一樣的被傳輸。但是這裡流並非指的是數據,而是指的是一個容器,這個容器有兩種結構,一種是結構式的容器,另一種是流式的容器,對應的文件就是結構式的文件和流式的文件,所謂流式的文件指的是無結構的文件按照一個或多個字節讀或者寫,數據就像流水一樣往裡或者外流動,對於結構式的文件則是按照一定的規則把同屬性的數據歸為一類,並通過索引來獲取數據。

對於流的理解,在Unix高級編程中並沒有定義,但是一些定義太過於官方,這裡拿出Unix高級編程的原話來歸納流的定義。

標準I/O文件流可以用於單字節或多字節(“寬”)字符集。流的定向決定了所讀,寫的字符是單字符還是多字節的。當一個流最初被創建時,它並沒有定向。若在未定向的流上使用一個多字節I/0函數,則將流的定向設置為寬定向的。若在未定向的流上使用一個單子I/O函數,則將該流的定向設為字節定向。只有兩個函數可改變流的定向。freopen函數清除一個流的定向;fwide函數可用於設置流的定向。函數原型如下: int fwide(FILE *fp, int mode);

這裡做簡要的說明,所謂的定向的意思就是上面說的是一個字節的寫或讀,還是多個字節的寫或讀。再來看fwide函數,上面說它是用來設置流的定向的,那麼如何設置,可以從參數可以看出它是對一個文件的操作,因為在應用層想對文件操作就必須通過文件描述符(fp),並把fp傳給對應的I/O庫就實現相應的操作,那麼很明顯fwide操作的就是fp所指向的文件,上面說fwide函數是來設置流的定向,那麼這個流很明顯就是文件的意思。

在P116原話如下:

當打開一個流時,標準I/O函數fopen返回一個指向FILE對象的指針。該對象通常是一個結構,它包含了標準I/O庫為管理該流需要的所有信息,包括用於實際I/O的文件描述符、指向用於該流緩衝區的指針、緩衝區的長度、當前在緩衝區中的字符數以及錯誤標誌等。

應用程序沒有必要檢測FLE對象。為了引用一個流,需將FILE指針作為參數傳遞給每個標準I/O函數。

很明顯上面說的流就是文件,但是之所是流而不是文件而是把概念抽象化了,正如設備在操作系統中統一看做文件,而對於那些存儲無結構數據的容器(比如文件)都可以叫做流,所以換句話說流就是存儲數據的容器,但是該容器不分結構存儲數據

這裡只是簡單的理解,理解並不深入,若有大佬還請寫下正確的見解,大家一起學習,拜託了!!!!


分享到:


相關文章: