1. 程式人生 > >C++中的標準IO庫詳解

C++中的標準IO庫詳解

<分析>:

(1)IO類之間的繼承關係圖如下:


(2)IO型別有三個獨立的標頭檔案,iostream標頭檔案定義了控制視窗的型別,fstream標頭檔案定義了讀寫已命名檔案的型別,sstream標頭檔案定義的型別則用於讀寫儲存在記憶體中的string物件;

(3)對IO物件使用繼承有個重要的含義:如果函式有基類型別的引用形參時,可以給函式傳遞其派生型別的物件;

(4)為了支援國際字元wchar_t型別的讀寫,在每個IO類前面加上w與讀寫char型別的IO型別分開來,於是就變成wiostream,wfstream,wstringstream等類來讀取wchar_t型別;

(5)標準庫型別的物件不容許進行復制或者賦值操作,所以不能儲存容器中,函式的形參和返回型別也不能為流型別,如果需要傳遞或者返回IO物件,必須傳遞或者返回該物件的指標或引用,因為讀寫要改變io的狀態,所以引用或者指標必須為非const的。

(6)fstream型別繼承了iostream型別,另外還定義了兩個新操作--open和close,以及形參為要開啟的檔名的建構函式,該建構函式的形參為c風格的字串,所以當檔名是string物件時,需要用c_str成員函式獲取c風格字串,例如:

                                             string  ifile(“moring”);--檔名存在string物件中;

                                         ifstream  infile(ifile.c_str());--形參為c風格字串的建構函式;

(7)fstream中open函式將已經存在的fstream物件與特定檔案繫結:

                                                                 ifstream infile;

                                              infile.open(“moring”);--與(6)中的操作結果一樣;

(8)如果希望fstream物件與另一個不同的檔案相關聯,必須先關閉(close)現在的檔案,然後再開啟(open)另一個檔案:

                                                           infile.close();

                                                      infile.open(“next”);

(9)開啟已經開啟的流物件會發生錯誤,必須用clear進行清除;

(10)關閉流並不能改變流的內部狀態,直到執行clear操作重新回覆流的狀態為止,如果打算重新用已存在的流物件,必須呼叫close操作進行關閉和呼叫clear操作進行清空。

(11)模式是檔案的屬性而不是流的屬性,以下為所有檔案模式的含義:

in

開啟檔案做讀操作

out

開啟檔案做寫操作

app

每次在寫之前找到檔案尾

ate

開啟檔案後立即將檔案定位到檔案尾

trunk

開啟檔案時清空已存在的檔案流

binary

已二進位制的模式進行IO操作

       1)out/trunk/app模式只能用於指定的ofstream和fstream物件關聯的檔案;in物件只能用於指定與iftream和                fstream物件關聯的檔案;所有檔案都可以使用ate/binary;

       2)ate只在開啟時有效,定位到檔案尾;

       3)以binary開啟的檔案以位元組系列的形式處理,不解釋其中的字元;

       4)預設情況下,ifstream以in模式開啟,ofstream則以out模式開啟,該檔案會被清空,fstream以in和out模               式開啟,不進行清空;

       5)對於ofstream開啟的檔案,要儲存其中的資料,必須顯式指定app模式開啟;

       6)fstream若只指定out模式開啟,不使用in模式,檔案會被清空;如果以trunk模式開啟,不管是否使用in模                  式,檔案都會被清空;

(12)stringstream繼承了iostream型別,同時定義了一個string型別的建構函式,還定義了一個str的成員,用於讀取或者設定物件的string值,無引數的str函式將返回stringstream物件所關聯的string物件,有引數的str函式將該stringstream物件與實參相關聯,使用這個類要包含標頭檔案<sstream>。

(13)stringstream物件不能使用open與close函式;

(14)stringstream提供了轉換和格式化,可以將其中string中的內容轉換為int等型別的數值,也可以將int型別的數值轉換為string物件中,在寫入stringstream物件時,一般要在相鄰不同型別之間加上空白字元,這樣方便將其還原到對應型別的變數中,例如:

                                                int val1=512,val2=1024;

                                             ostringstream  format_message;

                       format_message<<”val1:”<<val1<<”\n”<<”val2:”<<val2<<”\n”;

               //獲取format_message中儲存的string,然後建立istringstream物件:

                               istringstream  input_istring(format_message.str());

               //還原val1,val2,同時在讀取的時候忽略空白字元

                                                            string dump;

                                        input_istring>>dump>>val1>>dump>>val2;

(15)stringstream可以用於不同型別之間的轉換,比如將只有含有數字的字串讀入ostringstream物件,然後將其在讀寫到int型別的變數,便實現字串到int型的轉換;

相關推薦

C++標準IO

<分析>: (1)IO類之間的繼承關係圖如下: (2)IO型別有三個獨立的標頭檔案,iostream標頭檔案定義了控制視窗的型別,fstream標頭檔案定義了讀寫已命名檔案的型別,ss

C++11 std::chrono

toolbar space max mil exp 值類型 cond 精度 ++i 所謂的詳解只不過是參考www.cplusplus.com的說明整理了一下,因為沒發現別人有詳細講解。   chrono是一個time library, 源於boost,現在已經是C++標準。

C#HttpWebRequest的用法

網站 default 編碼方式 對數 c# toarray collect acc like 本文實例講述了C#中HttpWebRequest的用法。分享給大家供大家參考。具體如下: HttpWebRequest類主要利用HTTP 協議和服務器交互,通常是通過 GET 和

C++的map用法

時間 占用 sort函數 數組 例程 通道 組織 sso 查找 Map是 STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的數據 處理能力,由 於這個特性,它完成有可能在我們處理一對一數據的

【轉載】 c++static的用法

ostream 並不會 style 轉載 程序員 都是 note 每次 reference 出處: http://blog.csdn.net/majianfei1023/article/details/45290467 C 語言的 static 關鍵字有三種(具體來說是

C++的多態

C++ 多態 [TOC]#虛函數和多態 虛函數 定義:類的成員函數前面加virtual關鍵字,則這個成員函數稱為虛函數。 ###代碼示例: class Person { public: virtual void Buyticket() { cout << "

C#string.format用法

個數 date 其中 位置 tr1 bsp 位數 數值 日期格式化 tring.Format 方法的幾種定義: String.Format (String, Object) 將指定的 String 中的格式項替換為指定的 Object 實例的值的文本等效項。String.F

深入C++API的問題_C 語言

前言:本文書寫的格式與其它不相同。本文題目說是關於C++ API的思考,其實也不僅僅是C++,對於其它語言同樣適用。 API實際是指Application Programming Interface,應用程式程式設計介面。對API是一套用來控制Windows的各個部件的外觀和行為的一套預先定義的Window

C++的容器類

C++中的容器類包括“順序儲存結構”和“關聯儲存結構”,前者包括vector,list,deque等;後者包括set,map,multiset,multimap等。若需要儲存的元素數在編譯器間就可以確定,可以使用陣列來儲存,否則,就需要用到容器類了。 1、vector 連續儲存結

c++size_t與ssize_t

----------------------------------size_t-------------------------------------- size_t是一些C/C++標準在stddef.h中定義的。這個型別足以用來表示物件的大小。 size_t的真實型

[C++] C++的巨集定義 C++巨集定義

轉載自:C++中的巨集定義 和 C++巨集定義詳解 一、#define解析     #define是C語言中提供的巨集定義命令,其主要目的是為程式設計師在程式設計時提供一定的方便,並能在一定程度上提高程式的執行效率,但學生在學習時往往不能 理解該

[C++] C++的宏定義

兩個 分配 學習 處理 編程 工作 計算 ++i 應用 轉載自:C++中的宏定義 和 C++宏定義詳解 一、#define解析 #define是C語言中提供的宏定義命令,其主要目的是為程序員在編程時提供一定的方便,並能在一定程度上提高程序的運行效率,但學生在學習時往

c++static的用法

C 語言的 static 關鍵字有三種(具體來說是兩種)用途: 1. 靜態區域性變數:用於函式體內部修飾變數,這種變數的生存期長於該函式。 int foo(){ static int i = 1; // note:1 //int i = 1; // not

C++繼承和派生(公有、私有、保護繼承的區別)

繼承和派生概述: 繼承和派生是同一個過程從不同角的度看 保持已有類的特性而構造新類的過程稱為繼承。 在已有類的基礎上新增自己的特性而產生新類的過程稱為派生。 被繼承的已有類稱為基類(或父類)。 派生出的新類稱為派生類(

c++c_str()的用法

//標準庫的string類提供了三個成員函式來從一個string得到c型別的字元陣列 //主要介紹c_str //c_str():生成一個const char*指標,指向以空字元終止的陣列。 //這個陣列應該是string類內部的陣列 #include <iostre

c++map的用法

說明下面我都以 map<string,   int> 型別來舉例。 一、定義          (1) map<string,   int>   Map;     (2) 或者是:typedef   map<string,int>  

C++發聲函式Beep

以前,我聽過一個神犇用C++函式做的音樂,當時的心裡就十分激動:哇,好厲害啊,好神啊。 這次,我終於通過自己無助的盲目的摸索、研究,寫出了這篇文章(此時我的內心是雞凍的233) 下面是正文: 其實啊,Windows API 就提供了一個這樣奇妙的發音函式,它就是Bee

C++set的用法

C++中set的用法 set的特性是,所有元素都會根據元素的鍵值自動排序,set的元素不像map那樣可以同時擁有實值(value)和鍵值(key),set元素的鍵值就是實值,實值就是鍵值。set不允許兩個元素有相同的鍵值。 set的各成員函式列表如下:

C++的Lambda表示式

我是搞C++的 一直都在提醒自己,我是搞C++的;但是當C++11出來這麼長時間了,我卻沒有跟著隊伍走,發現很對不起自己的身份,也還好,發現自己也有段時間沒有寫C++程式碼了。今天看到了C++中的Lambda表示式,雖然用過C#的,但是C++的,一直沒有用,也不知道怎麼

C++this指標的

成員函式中this是指向正在呼叫該函式的物件,this指正在建立物件內部的成員。同一個類中的函式可以通過this相互呼叫,普通函式不能通過this呼叫建構函式,但建構函式可以通過this訪問普通函式!.h檔案ifndef TEACHER_H_#define TEACHER_H