2014-01-20 31 views
4

我發現這個問題的回答爲Python,Java和Linux的腳本,而不是C++:寫入到兩個終端和文件C++

我想寫我的C的所有輸出++程序,終端和輸出文件。使用這樣的事情:

int main() 
{ 
freopen ("myfile.txt","w",stdout); 
cout<< "Let's try this"; 
fclose (stdout); 
return 0; 
} 

其輸出到唯一的命名爲「myfile.txt的」輸出文件,並防止其表示在終端上。我怎樣才能使它同時輸出?我使用visual studio 2010 express(如果這會產生任何影響)。

在此先感謝!

+3

您使用不同的流對象,其中一個重複調用的文件,併到stdout [自定義C++的cout類 – StoryTeller

+0

可能重複 - outpu t到控制檯和日誌文件](http://stackoverflow.com/questions/5942229/custom-c-cout-class-output-to-both-console-and-log-file) – feetwet

回答

1

沒有內置的方法來做到這一步。您必須將數據寫入文件,然後分兩步將數據寫入屏幕。

您可以編寫一個函數來接收數據和文件名,併爲您做這件事,以節省您的時間,某種記錄功能。

5

可能的解決方案:使用靜態流cout類對象來寫入cout和文件。

粗糙例如:

struct LogStream 
{ 
    template<typename T> LogStream& operator<<(const T& mValue) 
    { 
     std::cout << mValue; 
     someLogStream << mValue; 
    } 
}; 

inline LogStream& lo() { static LogStream l; return l; } 

int main() 
{ 
    lo() << "hello!"; 
    return 0; 
} 

您可能需要顯式處理流操縱不過。

Here is my library implementation.

+0

@Aly:如果你是滿意,你介意接受這個答案,以便問題可以標記爲「解決」?謝謝。或者,您可以發佈自己的答案並接受它。 –

1

我必須這樣做的方法,它是基於訂購模式。

在這個模型中,所有的日誌記錄都轉到「日誌記錄」管理器,然後你有「訂閱者」決定如何處理這些消息。消息有主題(對我來說是一個數字)和記錄器訂閱一個或多個主題。

爲了您的目的,您創建了2個訂戶,一個輸出到文件,另一個輸出到控制檯。

在您的代碼邏輯中,您只需輸出消息,並且在此級別不需要知道將要完成的操作。在我的模型中,雖然你可以首先檢查是否有任何「聽衆」,因爲這被認爲比構造和輸出只會以/ dev/null結尾的消息更便宜(你知道我的意思)。要做到這一點

+0

Upvoted,因爲這是一個很好的答案;然而,對於OP所需要的,它可能太重了。 –

0

一種方式是寫一個小包裝要做到這一點,例如:

class DoubleOutput 
{ 
public: 
    // Open the file in the constructor or any other method 
    DoubleOutput(const std::string &filename); 
    // ... 
    // Write to both the file and the stream here 
    template <typename T> 
    friend DoubleOutput & operator<<(const T& file); 
// ... 
private: 
    FILE *file; 
} 

爲了有一個類,而不是一個功能,使您使用RAII成語(https://en.wikipedia.org/wiki/Resource_acquisition_is_initialization

要使用它:

DoubleOutput mystream("myfile"); 
mystream << "Hello World"; 
+0

我認爲你需要延長這個答案。它目前的形式不起作用。 –