關於C 中的重定位

2022-04-29 17:30:07 字數 2140 閱讀 2484

"標準庫定義了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

int main()

std::cout << "cout" <:cerr>

先通過編譯器生成以上的 cprogram.exe。再在cmd下執行此程式:

命令列操作符》用於對cout進行重定向,操作符1>對cout進行重定向,操作符2>對cerr和clog進行重定向。

三次中cprogram.log中 分別是cout;cout;cerr clog。 即分別是終端中預設的哪些輸出內容,因其被重定向到了cprogram.log中。

以上是作業系統重定向,稱為外部重定向;

下面的都是 內部重定向的實現

#include

#include

using namespace std;

int main()

輸出內容為就是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"

clog << "you are"

//同理 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 的用途與侷限:

u boot中重定位

在學習 u boot的時候,對程式重定位不理解,不知道為什麼要進行重定位,在網上查詢資料學習了一下。首先,要了解一下乙個程式的生成的四個步驟 預處理 編譯 彙編 鏈結。經過這四步,最終才生成可執行檔案bin檔案。預處理主要是巨集定義的展開,編譯主要是進行語法此分析,如我們常見的語法錯誤,某些函式未定...

脫殼入門 關於重定位表的重建

對於脫dll檔案的殼時需要注意對重定位表的操作,在重建重定位表的時候需要注意殼 是否對原程式中需要重定位的資料進行了加密。也就是在dump檔案時不能單純的nop過殼的重定位 因為有可能重定位資料被加密了。如果直接nop過此殼的重定位處理 那麼dump的檔案中的需要重定位的資料是錯誤的。按照正常的思路...

c 中關於list去重的問題

system.linq下為ienumerable list是它的子類 拓展了distinct方法,用於對結果集進行去重處理。下面我們來看一下我們可能正在犯的錯誤吧。首先我們定義乙個class來演示,並且向它追加一些重複的成員,看一下distinct 的效果如何 static void main st...