第十七章 輸入和輸出文件(1)c++輸入和輸出概論

(一)C++的輸入和輸出概論

C語言採用stdio.h頭文件來定義標準輸入輸出方法,這在c++中同樣適用,只不過頭文件變爲了<cstdio>。而c++中更常見的類是由頭文件<iostream>,<fstream>定義的輸入輸出流類庫和文件輸入輸出流類庫。

1.流和緩衝區

c++程序將輸入和輸出看成是字節流,流是由一個個字節構成的,c++程序只檢查字節流,而不考慮字節流來自何方,去往何處。因此,c++將輸入輸出與具體的設備分離開,便於編程。

輸入輸出流就像一個管道,管道的兩端分別是流內字節的來源和去向。具體來說,管理輸入包括兩步:一是將輸入流與輸入去向的程序關聯起來,二是將輸入流的文件端與文件連接起來(這裏的文件指的可以是文件,也可以是設備)。輸出管理同樣如此,一邊是將程序與輸出流的程序端相連,一邊是將輸出目標與輸出流的文件端連接起來。

通常,使用緩衝區可以更高效地處理輸入和輸出。清空緩衝區的動作叫作刷新緩衝區,flushing the buffer。對於文件來說是如此,對於鍵盤和屏幕輸入輸出操作也是如此,對鍵盤輸入設置緩衝,可以讓我們在數據流入程序之前能夠更正輸入,因此通常,當我們鍵盤輸入回車之後纔會刷新緩衝區,而輸出時輸出回車字符時才刷新屏幕的緩衝區。

2.流,緩衝區和iostream文件

(1)iostream頭文件中包含了許多能夠管理流和緩衝區的類,這些類用來創建,管理和實現流和緩衝區:

streambuf類爲緩衝區提供了內存,並提供了可以填充,訪問,刷新和管理的方法。

ios_base類表示流的一般特徵。

ios類基於ios_base,其中包括了一個指向streambuf對象的指針成員

ostream類基於ios類,是輸出

istream類基於ios類,是輸入。

iostram類是基於ostream類和istream類的,因此具有輸入輸出方法

要使用這些類,必須創建相應的對象,比如使用ostream對象cout來管理輸出,創建這樣的對象將打開一個流,自動創建緩衝區,並與流關聯起來,同時這些對象可以使用相應的成員函數。

istream和ostream都是char具體化的typedef,而wistream和wostream都是wchar_t的具體化,例如wcout用於輸出寬字符流。一些輸入輸出中獨立於類型的信息是在ios_base中定義的,比如ios_base::fixed;

它們的層次結構是streambuf本身是用來實現內存和緩衝區的類,然後ios_base實現了流的一些特性,比如格式等等,但是不能使用緩衝區,然後ios_base派生出了ios,可以使用緩衝區;接着ostream和istream類是可以直接使用的輸出輸入類,但他們都是單向的;最後,iostream類是多重繼承了這兩個類,可以創建雙向的流。

(2)在程序中包含iostream將自動創建八個流對象,4個用於寬字符流,4個用於窄字符流。

cin是標準輸入流,通常被關聯到標準輸入設備(鍵盤),wcin也是如此,但是主要處理wchar_t數據類型。

cout是標準輸出流,被關聯到屏幕,wcout與此相類似,處理的是wchar_t類型。

cerr和wcerr是標準錯誤流,默認關聯到屏幕,這兩個流沒有被緩衝,就是有錯誤直接發送到屏幕。

clog和wclog也是標準錯誤流,同樣關聯到屏幕,但這兩個流是被緩衝的

(3)總之,流的一端與程序相連,另一端與標準輸出相連,cout對象憑着streambuf對象的幫助,管理着流中的字節流。

3.重定向

(1)標準輸入輸出通常都連接着鍵盤和屏幕,但很多系統,如unix和linux,windows都支持重定向,也就是改變標準輸入輸出的流向。

(2)程序輸出重定向指的是程序,也就是說我們可以指定程序的輸入輸出的另一個端點的連接,而這一端始終是連接着程序的。比如count是一個程序,我們通過count < a.txt >b.txt將標準輸入與a.txt連接,而標準輸出與b.txt連接,程序與標準輸入輸出的程序端連接,這就是重定向,重定向的是非程序端。

(3)值得一提的是,cout是標準輸出流,上面的重定向是指的cout,而cerr和clog代表的標準錯誤流並不會重定向,而是依然從屏幕輸出。有一些程序也會允許對標準錯誤流進行重定向,比如Unix和linux系統採用2>重定向標準錯誤流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章