1. 程式人生 > >c++中輸出流cout和cerr及clog的區別

c++中輸出流cout和cerr及clog的區別

本人菜雞一個,初識c++,從深鑑科技給的main.cc檔案中開始學習c++,不懂輸出流控制,在網上查了資料後整理的:

c語言標準輸出就printf一個,但是c++意思就是c的加強版唄,當然輸出自然可以多一點,有cout、cerr、clog,區別就在於三個都能做輸出,但是cout需要經過緩衝區輸出,可以重定向,而cerr和clog是專門輸出錯誤資訊的輸出,下面是我從網上找的相關資料,可以用來參考:

之前一直在用,但就是沒在意兩者到底有啥卻別,今天又想到這個問題,總結下吧(以下的內容均是本人從網上查閱資料看來整理的,暫時還沒有查閱官方資料,不保證準確,歡迎討論)

其實大家平常常會用的主要有三個:cout、cerr、clog,首先簡單介紹下三者。

這三者在C++中都是標準IO庫中提供的輸出工具(至於有關的過載問題在此不討論):

cout:寫到標準輸出的ostream物件;

cerr:輸出到標準錯誤的ostream物件,常用於程式錯誤資訊;

clog:也是輸出標準錯誤流(這點兒和cerr是一樣的),貌似平時很少用到這個啊;

具體在輸出的時候,三者是有區別的:

1、cout經過緩衝後輸出,預設情況下是顯示器。這是一個被緩衝的輸出,是標準輸出,並且可以重新定向(關於重新定向的意思可以參考下面的例子);

2、cerr不經過緩衝而直接輸出,一般用於迅速輸出出錯資訊,是標準錯誤,預設情況下被關聯到標準輸出流,但它不被緩衝,也就說錯誤訊息可以直接傳送到顯示器,而無需等到緩衝區或者新的換行符時,才被顯示。一般情況下不被重定向

(重定向這點兒好像有爭論,有些人說和系統有關,本人還不太明白)

對於為什麼有cerr和clog

  比如,你的程式遇到呼叫棧用完了的威脅(無限,沒有出口的遞迴)。

  你說,你到什麼地方借記憶體,存放你的錯誤資訊?

  所以有了cerr。其目的,就是在你最需要它的緊急情況下,還能得到輸出功能的支援。

  緩衝區的目的,就是減少刷屏的次數——比如,你的程式輸出聖經中的一篇文章。不帶緩衝的話,就會每寫一個字母,就輸出一個字母,然後刷屏。有了緩衝,你將看到若干句子“同時”就出現在了螢幕上(由記憶體翻新到視訊記憶體,然後重新整理螢幕)。

附:

#include <iostream>

using namespace std;

int main()

{

cout << "cout" << endl;

cerr << "cerr" << endl;

return 0;

}

執行此程式之後,我們在命令列執行如下命令:

假設編譯執行後的可執行檔名為cerr.exe,其目錄為E:\cpro\cerr\Debug\cerr.exe

在命令列下,切換到這個目錄下,執行命令:cerr>test.log

命令列輸出如下:

E:\cpro\cerr\Debug>cerr>>test2.log

Cerr(這是在命令列下輸出的)

檢視test2.log檔案,發現裡面只有

Cout

一行。

可能這個就是所謂的重定向輸出。

從這裡可以看出:
cout是在終端顯示器輸出,cout流在記憶體中對應開闢了一個緩衝區,用來存放流中的資料,當向cout流插入一個endl,不論緩衝區是否漫了,都立即輸出流中所有資料,然後插入一個換行符. 

cerr流物件是標準錯誤流,指定為和顯示器關聯,和cout作用差不多,有點不同就是cout 
通常是傳到顯示器輸出,但可以被重定向輸出到檔案,而cerr流中的資訊只能在顯示器輸出. 
clog流也是標準錯誤流,作用和cerr一樣,區別在於cerr不經過緩衝區,直接向顯示器輸出資訊,而clog中的資訊存放在緩衝區,緩衝區滿或者遇到endl時才輸出.

今天看C++Primer(第四版)的時候又看到了這幾個,摘抄一段話,供大家參考:

"標準庫定義了4個IO物件,處理輸入時使用命名為cin的istream型別物件,這個物件也成為標準輸入。處理輸出時使用命名為cout的ostream型別物件,這個物件也稱為標準輸出。標準庫還定義了另外兩個ostream物件,分別命名為cerr和clog。cerr物件又叫標準錯誤,通常用來輸出警告和錯誤資訊給程式的使用者,而clog物件用於產生程式執行的一般資訊。一般情況下,系統將這些物件與執行視窗聯絡起來,這樣,當我們從cin讀入時,資料從執行程式的視窗讀入,當寫到cout、cerr、clog時,輸出寫至同一視窗。執行程式時,大部分作業系統都提供了重定向輸入或者輸出流的方法。利用重定向可以將這些流與所選擇的檔案聯絡起來"


相關推薦

c++輸出coutcerrclog區別

本人菜雞一個,初識c++,從深鑑科技給的main.cc檔案中開始學習c++,不懂輸出流控制,在網上查了資料後整理的:c語言標準輸出就printf一個,但是c++意思就是c的加強版唄,當然輸出自然可以多一點,有cout、cerr、clog,區別就在於三個都能做輸出,但是cout

VS2010下編譯輸入輸出coutcin ,printf

printf是c中保留下來的,cout 和cin是c++的輸入輸出流,存在於檔案iostream檔案中,這個是C++自帶的標頭檔案 遇到問題,編譯cout時,提示,找不到cout,原因:沒有將iostream包含在VC++的庫中,解決方法:在屬性-VC++的附加包含目錄中新增include檔

C++關於int *p int* p的區別

根據C++Primer介紹: 對於int* p(這種寫法合法,但是容易造成誤導),其基本資料型別是int,後面的*其實是宣告符。在一組公用的資料型別後面可以使用不同的宣告符。例如: int i =10

C#陣列、ArrayListList三者的區別

    在C#中陣列,ArrayList,List都能夠儲存一組物件,那麼這三者到底有什麼樣的區別呢。 陣列     陣列在C#中最早出現的。在記憶體中是連續儲存的,所以它的索引速度非常快,而且賦值與修改元素也很簡單。 //陣列 string[] s=new string[

c#陣列,ArrayListList 三者的區別

在c#中,陣列在記憶體中是連續的,索引速度很快,賦值和修改也很簡單。string[] s=new string[2]; //賦值 s[0]="a"; s[1]="b"; //修改 s[1]="a1"; 但是陣列也有一些不足的地方,在資料的兩個資料

C#陣列、ArrayListList三者的區別 .

    在C#中陣列,ArrayList,List都能夠儲存一組物件,那麼這三者到底有什麼樣的區別呢。 陣列     陣列在C#中最早出現的。在記憶體中是連續儲存的,所以它的索引速度非常快,而且賦值與修改元素也很簡單。 [csharp] view plaincopyprint? <SPAN 

c/c++輸入輸出iostream與stdio之間的區別

三者之間的區別  #include<iostream>     在新的標準C++中使用。#include<iostream>是標準的C++標頭檔案,任何符合標準的C++開發環境都要有這個標頭檔案,使用時一定要引入名稱空間"using namespa

C++標準重定向coutcerr區別

前言 當我們把一個win32控制檯的程式重構成介面程式的時候,之前的所有cout輸出語句就變得沒用了,而不得不重新查詢替換成其他輸出顯示方式。或者要輸出大量資訊的時候,想要看某一步的輸出,卻很快地被新的輸出覆蓋了(尤其在輸出視窗的緩衝區設得比較小的時候)。在這些情況下,如

C++輸入輸出加速器,關閉同步,ios::sync_with_stdio(false) cin.tie(0)

bsp c++ 語句 leetcode return ios 使用 而不是 關閉 leetcode練習時,總會發現運行時間短的代碼都會有類似: static int x=[](){ std::ios::sync_with_stdio(false); cin

cc++輸出字符指針字符串指針的問題

cout 指針 inux 問題 執行 格式 一個 輸出 [] 首先搞清楚在c語言中沒有字符串的類型,所以對字符串操作,有兩種形式:可以用字符指針,或者字符串數組(這裏的指針變量c,系統會為其重新分配內存。 c程序示例: 1 #include <stdio.h&g

Java資料輸入輸出——DataInputStreamDataOutputStream

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

C++輸出cout的執行順序問題

首先看一個例子: int fun1() {  cout<<"num1"<<endl;  return 1; } int fun2() {  cout<<"num2"<<endl;  return 2; }

fstream 判斷是否成功開啟檔案 | C++檔案(fstream)的使用方法示例

ifstream fin("filename"); if (!fin) { cout << "fail to open the file" <<endl; return -1;//或者丟擲異常。 } else { cout << "open

C++coutcerrclog區別

轉自:https://blog.csdn.net/garfield2005/article/details/7639833   之前一直在用,但就是沒在意兩者到底有啥卻別,今天又想到這個問題,總結下吧(以下的內容均是本人從網上查閱資料看來整理的,暫時還沒有查閱官方資料,不保證準確,

C++ 輸入輸出檔案輸入輸出

輸出到檔案 #include <iostream> #include <fstream> using namespace std; int i = 100; ofstream file("1.txt"); //檔案輸出物件,檔名

C++檔案檔案的區分

1、檔案的概念 檔案一般是指儲存在外部介質上資料的集合。 外存檔案包括:磁碟檔案、光碟檔案和U盤檔案等,使用最廣泛呢的還是磁碟檔案。 對使用者來說,常用到的檔案有兩類:一類是程式檔案,如.cpp檔案、.obj檔案和.exe檔案。 一類是資料檔案(data

JavaJNI的使用詳解第四篇:C/C++建立Java物件String字串物件對字串的操作方法

首先來看一下C/C++中怎麼建立Java物件:在JNIEnv中有兩種方法是用來建立Java物件的:第一種方法:jobject  NewObject(jclass clazz  , jmethodID methodID, ....):引數解釋:clazz:這個很簡單,就是需要建

C++檔案(fstream)的使用方法示例

C++檔案流: fstream  // 檔案流 ifstream  // 輸入檔案流 ofstream  // 輸出檔案流 #include <fstream> //建立一個文字檔案並寫入資訊 //同向螢幕上輸出資訊一樣將資訊輸出至檔案 #includ

C#、位元組、字元字串

首先要明白它們本身是由什麼組成的: 流:二進位制 位元組:無符號整數 字元:Unicode編碼字元 字串:多個Unicode編碼字元 那麼在.net下它們之間如何轉化呢? 一般是遵守以下規則: 流->位元組陣列->字元陣列->字串 下

C++ 輸入輸出之檔案操作檔案

使用成員函式read和write讀取二進位制檔案 istream &read(char *buffer, int len);ostream& write(constchar *buffer, int len)舉例:將一批資料存入磁碟檔案 student stu[2] = {{"Li", 100