2014-01-11 51 views
0

我只是想知道,如果有一些辦法喲能夠做到這一點:ofstream - 我可以將「cout」重定向到文件嗎?

ofstream exemple (name); 
exemple << Display(); 

顯示()是一個無效的方法,只有做這樣的事情:

cout << "Something" << endl; 

我會這樣做是因爲我已經爲每個類編寫了所有方法Display(),並且我想將它們發送到cout的內容放到我的文件中,或者重新創建一些方法「string Display()」。

可能嗎?

謝謝! Marco

+0

您可以返回ostream。或者做流操作符重載(http://www.tutorialspoint.com/cplusplus/input_output_operators_overloading.htm),因爲你說你正在使用類。 – Gasim

+0

我試過了,但得到一個錯誤,我無法返回一個私人成員(cout)。 –

回答

5

You can change cout's buffer,但cout是一個全局變量,這樣會影響整個程序。

爲什麼不讓Display()接收輸出流作爲參數?

void Display(std::ostream &cout) { 
    cout << "Something" << endl; 
} 
+0

非常簡單而有用! 謝謝! –

4

不,不是那樣的。您不能使用void函數的結果,因爲它沒有。

可能破解周圍的std::cout基礎緩衝區,交換它example的,但我不會推薦這 ...在你的問題中的代碼仍然是無效的。

你可以這樣做:

#include <ostream> 
#include <fstream> 

void Display(std::ostream& os) 
{ 
    os << "Something" << std::endl; 
} 

int main() 
{ 
    const std::string name = "someFile.txt"; 
    std::ofstream example(name); 
    Display(example); 
} 
1

您可以Display操縱display_msg的輔助功能,它封裝輸出的類。 Display無法返回void,因爲如果您正在查找要使用的語法os << Display(),則Display將不得不返回void以外的內容。

這裏是display_msg定義:因爲它執行什麼重要的

class display_msg { }; 

類爲空。我們將重載插入運算符這個類,這樣我們就可以訪問輸出流,我們的自定義數據插入到:

std::ostream& operator<<(std::ostream& os, const display_msg&) 
{ 
    return os << "My message"; 
} 

這是一個非常簡單的設置。但正如您所說,您希望將輸出重定向到標準輸出(std::cout)。爲此,您必須將std::cout的緩衝區複製到文件流中。你可以做,使用RAII(以管理對象之間的壽命依賴):

struct copy_buf 
{ 
public: 
    copy_buf(std::ios& lhs, std::ios& rhs) 
     : str(lhs), buf(lhs.rdbuf()) 
    { 
     lhs.rdbuf(rhs.rdbuf()); 
    } 

    ~copy_buf() { str.rdbuf(buf); } 
private: 
    std::ios& str; 
    std::streambuf* buf; 
}; 

插入器可以使用這個像這樣:

std::ostream& operator<<(std::ostream& os, const display_msg&) 
{ 
    copy_buf copy(os, std::cout); 
    return os << "My message"; 
} 

Display是返回類的簡單幫助函數:

display_msg Display() 
{ 
    return display_msg(); 
} 

std::ifstream f("in.txt"); 
f << Display(); // redirects to standard output 
相關問題