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型...