C 流與標準IO庫

2021-06-25 08:24:02 字數 3944 閱讀 3637

1. 流

資料在計算機裝置和記憶體之間移動,其基本單位為字元,故將其形象地稱為流。c++中把輸入輸出流定義為類,這裡的輸入、輸出是針對記憶體而言的。流類的物件稱為流物件。每個流物件在記憶體中有自己的緩衝區用於暫存資料。流物件不能複製或賦值,但可以將其引用或指向流物件的指標作為函式的引數或者返回值。

c++ primer(第四版)中主要講了三類流:標準輸入輸出流、檔案流和字串流。顧名思義,與流的互動物件分別為標準裝置、外設和字串。

2.標準輸入/輸出流

標頭檔案:iostream/istream/ostream。後兩者是iostream的子類,分別對應標準輸入流和標準輸出流。iostream物件既可用於輸入又可以用於輸出。

2.1 標準輸出流

常用流物件:cout、cerr和clog。其中cerr負責向標準輸出(螢幕)輸出錯誤資訊(字串形式)。與clog的區別的前者不會經過緩衝區而直接輸出至螢幕。

緩衝區:暫存資料。記憶體中的資料首先存在輸出快取區中,然後再輸出至標準輸出(螢幕)。

以下情況下會重新整理輸出緩衝區:

a) 程式正常結束。若程式非正常退出且未作其它措施,則流緩衝區不會重新整理。

b) 緩衝區已滿。

c) 顯式呼叫函式來重新整理。可以通過endl、ends和flush操作符來顯示重新整理。endl會插入換行符,ends會插入乙個空字元(null),flush不會新增任何字元。

d) unitbuf設定流狀態:cout << unutbuf << ... << nounitbuf; 則...中的每一次輸出都會重新整理一次緩衝區,直到nounitbuf操作符取消強制每次重新整理。

e) 輸入流與輸出流相關聯(tie),讀輸入流時將會重新整理輸出緩衝區。cin.tie(&cout); ostream *pos = cin.tie(); cin.tie(0).表示了cin與cout之間的繫結與解繫結操作。乙個ostreram物件一次只能被乙個istream物件所繫結。

輸出物件:可以為c++內建物件,或者重定義了輸出操作符的自定義物件。

輸出格式控制:可以通過使用控制符(需要include)或者流物件的內建函式:

a) 數值進製:cout << hex << a << dec << b << oct << c << setbase(int) <<d; 或者 cout.setf(ios::hex)/cout.setf(ios::dec)/cout.setf(ios::oct);其中setbase(int)的引數取值為8,10或16。若通過呼叫輸出流物件的內建函式輸出,則會帶有字首(0x/0)。設定進製之後的整數輸出一直按此進製,直到顯式改變進製(cout內建函式方 式需要呼叫cout.unsetf(...))。

b) 寬度設定:cout << setw(int) << obj; 或者cout.width(int);用於設定輸出物件的最小寬度。

c) 預設填充: cout << setfill(char) << obj; 或者cout.fill(char); 用於不夠指定寬度時空白字元的填充。

d) 小數輸出格式:cout << setiosflags(ios::scientific) << a ; 或者cout.setf(ios::scientific);ios::scientific:科學計數法;ios::fixed:普通小數。

e) 小數精度: cout << setprecision(int) << a; 或者cout.precision(int)。科學計數法中引數表示小數點後有效數字位數,小數表示中引數表示總共的有效位數。

f) bool值輸出字串:cout << boolalpha << b;

注:b和c設定之後僅對下一次輸入有效;cout.setf的引數可以為用「|」隔開的設定組合。例如進製和表示法、精度的組合。

其他方法:可以用put方法實現字元的輸出:cout.put(ch) 或者 putchar(ch);其中前者需要include。

2.2標準輸入流

常用物件:cin。

緩衝區:同標準輸出流,標準裝置的輸入線暫存於記憶體中的輸入緩衝區,然後再輸入值記憶體中的相應位置。

緩衝區的重新整理:fflush(cin);

流成員函式:

a) cin.get() :在標準輸入中讀取乙個字元並且返回該字元。

b) cin.get(ch) :在標準輸入中讀取乙個字元並且賦值給ch。

c) cin.get(char *p, int n, char del); 用於在標準輸入中讀取n-1個字元至p指向的記憶體中。若前n-1個字元中出現了字元del,則停止讀入。

d) getchar函式:主要作用是將cin後移一位,越過無用的字元(比如空格)。

字串的輸入:遇到空格、製表或換行時停止。或者可以呼叫getline()函式來實現整行的讀取:cin.getline(str); 或者getline(cin, str);

其他成員:eof()表示檔案尾; ignore(int n, char del) 表示忽略前n個字元或者del及其之前的m(m2.3 流狀態

狀態常量:strm::badbit; strm::failbit; strm::eofbit;

常量型別:strm::iostate

狀態函式:strm.bad(); strm.fail(); strm.eof(); strm.good(); 只有前三個均為false的時候strm.good()才是true。

狀態設定:strm.clear(); 將狀態設定為good()狀態。

strm.clear(flag); 將flag位設為true,其他位設為false。(可以同時設定多個狀態,用「|」隔開)

strm.setstate(flag);將flag設為true。(可以同時設定多個狀態,用「|」隔開)

strm.rdstate(); 讀取狀態。

說明:當遇到檔案尾的時候,會為eof()或bad(),若輸入錯誤,則會為fail()。

3.檔案流

3.1 標頭檔案:fstream;流型別:fstream/ifstream/ofstream

3.2 使用:建構函式中傳遞函式名(c風格字串)或者呼叫open函式(引數亦為c風格字串)。檢查檔案是否開啟成功,可以直接用if來判斷。讀取或者寫入完畢後應當       close(),close()之後應該clear()以恢復流狀態為正確狀態。

3.3 檔案模式:

in/out 通用: ate(定位至檔案尾), binary(二進位制讀寫方法)

in : in(讀取)

模式設定中同時包含in和out時表示既可以讀又可以寫,但是若再加上(「|」隔開)trunc,則等同於僅有out模式。

4. 字串流

4.1 標頭檔案 sstream.型別:stringstream/istringstream/ostringstream

4.2 stringstream 的使用:

a) 建構函式:stringstream strm; stringstream strm(str);

b) 返回string物件: strm.str();

c) 改變string物件:strm.str(str);

4.3 型別轉換:

步驟:由stringstream物件讀入string物件,然後再輸出為不同型別的物件賦值即可。型別必須對應:

stringstream strm;

string str("this a1 234 b 45");

string s1, s2, s3;

int i1, i2;

strm.str(str);

strm >> s1 >> s2 >> i1 >> s3 >> i2;如此才能實現一一對應。空格或者製表符或者換行符是必要的間隔。

5. 輸入輸出操作符:

>> 和 << 的箭頭方向即表示了資料流的流動方向:

對於標準輸入輸出來說,cin >> a;  cout << b; 分別表示資料出輸入緩衝區和進入輸出緩衝區;

對於檔案的輸入輸出:if  >> s; 和 of << s; 分別表示在檔案中讀資料(**件輸入緩衝區)到s和將s(**件輸出緩衝區)輸入至檔案。

對於stringstream:strm >> s; 和 strm << s 則分別表示為s賦值和讀取s。

標準IO庫 開啟流

開啟標準io流函式 include file fopen const char pathname,const char type file freopen const char pathname,const char type,file file fdopen int filedes,const c...

C 流之標準I O流

標準i o流是指對標準輸入裝置 鍵盤 滑鼠等 和標準輸出裝置 顯示器 印表機等 進行輸入輸出的過程。在根基類ios類中定義了3個使用者會經常使用的列舉型別,由於他們是在公用成員部分定義的,所以其中的每個列舉型別常量在加上ios 字首後都可以為本類成員函式和所有外部函式訪問。enum 以下是上述列舉常...

C 標準IO庫檔案流模式 ate

輸出檔案流 ofstream 標頭檔案 include 命名空間 std 一開始想用fstream通過檔案流的方式來替換c語言的檔案操作,原因其實很簡單,用 和 代替 讀寫感覺 更簡單,看的人也更容易理解,那麼問題就出現了 問題 fstream在開啟檔案的時候,以ios base openmode型...