標籤:
"標準庫定義了4個IO對象,處理輸入時使用命名為cin的istream類型對象,這個對象也成為標準輸入。處理輸出時使用命名為cout的ostream類型對象,這個對象也稱為標準輸出。標準庫還定義了另外兩個ostream對象,分別命名為cerr和clog。cerr對象又叫標準錯誤,通常用來輸出警告和錯誤資訊給程式的使用者,而clog對象用於產生程式執行的一般資訊。一般情況下,系統將這些對象與執行視窗聯絡起來,這樣,當我們從cin讀入時,資料從執行程式的視窗讀入,當寫到cout、cerr、clog時,輸出寫至同一視窗。運行程式時,大部分作業系統都提供了重新導向輸入或者輸出流的方法。利用重新導向可以將這些流與所選擇的檔案聯絡起來" ---------------------C++ Prime
重新開始看了這本書,決定哪裡看不懂的就扣一下。如上文中的重定位。
翻閱其他資料,做記錄,以便以後複習。
1.cout cerr clog都是ostream對象。cout clog 和 cerr 的區別在於有沒有經過緩衝區輸出以及能不能被重定位
cout是在終端顯示器輸出,cout流在記憶體中有自己對應的一個緩衝區,用來存放流中的資料,當向cout流插入一個endl,不論緩衝區是否滿了,都立即輸出資料流中所有資料,重新整理終端,一般是螢幕,然後插入一個分行符號。cout還可以輸出重新導向到檔案(實際上就是一個管道的一頭連輸出資料流,另一頭連檔案輸入資料流)。當緩衝區滿了,但是還沒有被消耗的情況下會出現被阻塞的問題。
cerr是指定為和顯示器關聯的,cerr沒有緩衝區,直接重新整理終端。並且一般只能輸出到終端,不能被重新導向。(但下面例子中的外部重新導向可以實現cerr的重新導向。)
tip:c是console的意思啊~~~
2.重新導向的實現
#include <iostream>
int main()
{
std::cout << "cout" <<std::endl;
std::cerr << "cerr" <<std::endl;
std::clog << "clog" <<std::endl;
return 0;
}
先通過編譯器產生以上的 Cprogram.exe。再在cmd下運行此程式:
命令列操作符>用於對cout進行重新導向,操作符1>對cout進行重新導向,操作符2>對cerr和clog進行重新導向。
三次中Cprogram.log中 分別是cout;cout;cerr clog。 即分別是終端中預設的哪些輸出內容,因其被重新導向到了Cprogram.log中。
以上是作業系統重新導向,稱為外部重新導向;
下面的都是 內部重新導向的實現
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream in("main.cpp"); //從檔案中讀取的類型 in 用main.cpp初始化in
cout<<in.rdbuf()<<endl; //rdbuf()是一個成員函數,檔案的全部內容
return 0;
}
輸出內容為就是main.cpp裡面的內容:
C++中rdbuf重新導向流的經典例子:
int main()
{
ofstream file("cjf.txt");
streambuf *log = clog.rdbuf(file.rdbuf());
//每個輸入輸出資料流對象包含一個成員函數rdbuf(),它返回的是一個指向對象streambuf的指標.通過這個指標可以對streambuf對象進行存取.
//寫了這句以後,下面遇到clog輸出,就輸出到cjf.txt中了,具體就是通過log對象指標來重新導向的吧
cout << "cout" <<endl;
cerr << "cerr" <<endl;
clog << "clog" <<endl;
clog.rdbuf(log);//重定位結束。下面的you are 會輸出在終端上 而非cjf.txt中
clog << "you are" <<endl;
system("pause");
//同理 foo.txt中的內容是 :重新導向的內容.終端螢幕無輸出。
ofstream log("foo.txt");
streambuf * oldbuf = cout.rdbuf(log.rdbuf());
cout << "重新導向的內容/n" ;
return 0;
}
重新導向clog對象到cjf.txt檔案對象,同樣cout,cerr也可以進行同樣的重新導向
可以利用rdbuf()重新指向到流裝置(文字檔、串口等等)。
整理著整理著又看到了第8章 標準IO庫
這篇文章是iostream 的用途與局限:http://www.cppblog.com/Solstice/archive/2011/07/17/151224.html
關於C++中的重定位