iostream

iostream

iostream是指iostream庫。iostream的意思是輸入輸出流,直接點說就是in(輸入) out(輸出) stream(流),取in、out的首字母與stream合成。

組成


iostream 庫的基礎是兩種命名為 istream 和 ostream 的類型,分別表示輸入流和輸出流。流是指要從某種 IO 設備上讀出或寫入的字元序列。術語“流”試圖說明字元是隨著時間順序生成或消耗的。
標準庫定義了 4 個 IO 對象。處理輸入時使用命名為 cin(讀作 see-in)的 istream 類型對象。這個對象也稱為標準輸入。處理輸出時使用命名為 cout(讀作 see-out)的 ostream 類型對象,這個對象也稱為標準輸出。標準庫還定義了另外兩個 ostream 對象,分別命名為 cerr 和 clog(分別讀作“see-err”和“see-log”)。cerr 對象又叫作標準錯誤,通常用來輸出警告和錯誤信息給程序的使用者。而 clog 對象用於產生程序執行的一般信息。

基本類模板

iostream(.h)庫的基礎是類模板的層級結構。類模板以一種與類型無關的方式,提供了這個庫的大部分功能。
基本類模板是一個類模板的集合,其中每個類模板有兩個參數:字元類型(charT)參數決定處理的元素類型,而特性參數 對每個特定的元素類型提供一些額外的特徵。
這個類層級結構中的類模板和它們的字元類型的實例相比,名字前面多了前綴basic_。例如,istream由之實例化而來的類模板名為basic_istream,fstream由之實例化而來的類模板名為basic_fstream,等等。唯一的例外是ios_base,因為它本身就是類型無關的,所以它並不基於任何類模板,而是一個正規類。

類模板實例

iostream(.h)庫中集成了兩組標準的整個iostream類模板層級結構的實例:一組是面向單位元組的,處理char類型的元素;另一組是面向寬位元組的,處理wchar_t類型的元素。
面向單位元組(char型)的實例可能是iostream(.h)庫更為人所知的一部分。 ios、istream和ofstream等類都是面向單位元組的。右圖是面向單位元組的所有類的名稱和關係。面向寬位元組(wchar_t型)的實例的命名規則與面向單位元組的實例相同,但所有類和對象名稱前有前綴w,例如wios、wistream和wofstream。

標準對象

作為iostream(.h)庫的一部分,頭文件聲明了一些用來在標準輸入輸出設備上進行輸入輸出操作的對象。
這些對象分為兩組:面向單位元組的,即常見的cin、cout、cerr和clog;其面向寬位元組的對應物,聲明為wcin、wcout、wcerr和wclog。

類型

iostream(.h)庫中的類很少對其成員的原型使用基本類型,而是通常使用根據其實例的特性定義的類型。對默認的char和wchar_t型的實例,類型streampos、streamoff和streamsize分別用以表示位置、偏移和大小。

操縱符

操縱符是用來與對流對象進行操作的插入(<<)和提取(>>)運算符一同使用的全局函數。它們通常變更流的屬性和格式設置。endl、hex和scientific是一些操縱符的例子。

語言


#include是標準的C++頭文件,任何符合標準的C++開發環境都有這個頭文件。
在舊的標準C++中,使用#include,但在新標準中,用#include,而且在VC中編程的同時要注意要添加命名空間(std):
iostream
iostream
頭文件包含了以下對象:
窄字元(char)
● cin:標準輸入流
● cout:標準輸出流
● cerr:錯誤的標準輸出流
● clog:用於記錄的標準輸出流
寬字元(wchar_t)
● wcin:標準輸入流(寬)
● wcout:標準輸出流(寬)
● wcerr:錯誤的標準輸出流(面向廣角)
● wclog:用於記錄的標準輸出流(寬)
在C++中,輸入輸出流被定義為類。C++的I/O庫中的類稱為流類(stream class)。用流類定義的對象稱為流對象。

歷史


很多學C++的都知道,C++中有一個iostream.h。這是C++早期版本所使用的,而現在版本已經不支持。現在版本用的是iostream。(#include "iostream")在C++的早期版本面世后,業界內普遍反映iostream.h速度慢,C++也在不斷地改進,而到某一版本,新寫出了一種輸入輸出流,此輸入輸出流速度較快,被業界普遍接受。C++標準為了凸顯C++與C的不同,以及C++對以往的進步,還有對C++早期語言的兼容,將此輸入輸出流命名為iostream,而同時也保留了iostream.h,這兩個文件可以在Viual Studio編輯器中的外部依賴項看到。它們的代碼是不盡相同的。
using namespace std詳解
一:
是不一樣,前者沒有後綴,實際上,在你的編譯器include文件夾裡面可以看到,二者是兩個文件,打開文件就會發現,裡面的代碼是不一樣的。
後綴為.h的頭文件c++標準已經明確提出不支持了,早些的實現將標準庫功能定義在全局空間里,聲明在帶.h後綴的頭文件里,c++標準為了和C區別開,也為了正確使用命名空間,規定頭文件不使用後綴.h。
因此,當使用時,相當於在c中調用庫函數,使用的是全局命名空間,也就是早期的c++實現;當使用的時候,該頭文件沒有定義全局命名空間,必須使用namespace std;這樣才能正確使用cout。
二:
所謂namespace,是指標識符的各種可見範圍。
C++標準程序庫中的所有標識符都被定義於一個名為std的namespace中。
由於namespace的概念,使用C++標準程序庫的任何標識符時,可以有三種選擇:
1、直接指定標識符。例如std::ostream而不是ostream。完整語句如下:
std::cout << std::hex << 3.4 << std::endl;
2、使用using關鍵字。
using std::cout;
using std::endl;
以上程序可以寫成
cout << std::hex << 3.4 << endl;
3、最方便的就是使用using namespace std;
例如:
#include
#include
#include
using namespace std;
這樣命名空間std內定義的所有標識符都有效(曝光)。就好像它們被聲明為全局變數一樣。那麼以上語句可以如下寫:
cout << hex << 3.4 << endl;
在iostream文件頭中定義的類有ios,istream,ostream,iostream,istream_withassign,ostream_withassign,iostream_withassign等。
因為標準庫非常的龐大,所以程序員在選擇的類的名稱或函數名時就很有可能和標準庫中的某個名字相同。所以為了避免這種情況所造成的名字衝突,就把標準庫中的一切都放在名字空間std中。但這又會帶來了一個新問題。無數原有的C++代碼都依賴於使用了多年的偽標準庫中的功能,他們都是在全局空間下的。
所以就有了等等這樣的頭文件,一個是為了兼容以前的C++代碼,一個是為了支持新的標準。
命名空間std封裝的是標準程序庫的名稱,標準程序庫為了和以前的頭文件區別,一般不加".h" .

內容


// iostream standard header
#if _MSC_VER > 1000
#pragma once
#endif
#ifndef _IOSTREAM_
#define _IOSTREAM_
#include 
#ifdef _MSC_VER
#pragma pack(push,8)
#endif
_STD_BEGIN
// OBJECTS
static ios_base::
Init _Ios_init;
extern _CRTIMP istream cin;
extern _CRTIMP ostream cout;
extern _CRTIMP ostream cerr, clog;
// CLASS _Winit
class _CRTIMP _Winit {
public:
_Winit();
~_Winit();
private:
static int _Init_cnt;
};
// WIDE OBJECTS
static _Winit _Wios_init;
extern _CRTIMP wistream wcin;
extern _CRTIMP wostream wcout, wcerr, wclog;
_STD_END
#ifdef _MSC_VER
#pragma pack(pop)
#endif
#endif