2010-07-20 337 views

回答

0

我不用C++編程,但這裏是我的建議:創建一個新的類,該類需要InputStream(C++或smth中的istream),並且每個傳入的字節都將在std.out和文件中傳輸。
我確信有一種方法可以用前面提到的類來改變標準輸出流。我記得,std.out是cout的某種屬性。
再次,我花了一個多星期前在C++上花了一週時間,所以有機會我所說的只是垃圾。

2

在這裏,我們去...

#include <fstream> 
    using std::ofstream; 
#include <iostream> 
    using std::cout; 
    using std::endl; 

int main(int argc, char* argv[]) 
{ 
    ofstream file("output.txt"); // create output file stream to file output.txt 
    if(!file) // check stream for error (check if it opened the file correctly) 
     cout << "error opening file for writing." << endl; 

    for(int i=0; i<argc; ++i) // argc contains the number of arguments 
    { 
     file << argv[i] << endl; // argv contains the char arrays of commandline arguments 
     cout << argv[i] << endl; 
    } 
    file.close(); // always close a file stream when you're done with it. 

    return 0; 
} 

PS:好吧,看你的問題錯(控制檯輸出/輸入查詢股價),但你仍然有想法,我認爲。

+0

'我 Johnsyweb 2010-07-20 13:20:01

+0

@Johnsywen:謝謝,糾正。 – rubenvb 2010-07-20 13:21:11

2

這個想法是創建std :: streambuf的衍生物,它將輸出數據到文件和cout。然後創建它的一個實例並使用cout.rdbuf(...);

下面是代碼(用MSVC++ 2010測試,應該在任何編譯工作):

class StreambufDoubler : public std::streambuf { 
public: 
    StreambufDoubler(std::streambuf* buf1, std::streambuf* buf2) : 
      _buf1(buf1), _buf2(buf2), _buffer(128) 
    { 
     assert(_buf1 && _buf2); 

     setg(0, 0, 0); 
     setp(_buffer.data(), _buffer.data(), _buffer.data() + _buffer.size()); 
    } 

    ~StreambufDoubler() { 
     sync(); 
    } 

    void imbue(const std::locale& loc) { 
     _buf1->pubimbue(loc); 
     _buf2->pubimbue(loc); 
    } 

    std::streampos seekpos(std::streampos sp, std::ios_base::openmode which) { 
     return seekoff(sp, std::ios_base::cur, which); 
    } 

    std::streampos seekoff(std::streamoff off, std::ios_base::seekdir way, std::ios_base::openmode which) { 
     if (which | std::ios_base::in) 
      throw(std::runtime_error("Can't use this class to read data")); 

     // which one to return? good question 
     // anyway seekpos and seekoff should never be called 
     _buf1->pubseekoff(off, way, which); 
     return _buf2->pubseekoff(off, way, which); 
    } 

    int overflow(int c) { 
     int retValue = sync() ? EOF : 0; 
     sputc(c); 
     return retValue; 
    } 

    int sync() { 
     _buf1->sputn(pbase(), pptr() - pbase()); 
     _buf2->sputn(pbase(), pptr() - pbase()); 
     setp(_buffer.data(), _buffer.data(), _buffer.data() + _buffer.size()); 
     return _buf1->pubsync() | _buf2->pubsync(); 
    } 

private: 
    std::streambuf*  _buf1; 
    std::streambuf*  _buf2; 

    std::vector<char> _buffer; 
}; 


int main() { 
    std::ofstream myFile("file.txt"); 
    StreambufDoubler doubler(std::cout.rdbuf(), myFile.rdbuf()); 
    std::cout.rdbuf(&doubler); 

    // your code here 

    return 0; 
} 

但是注意,更好的實現將使用模板的streambuf而不是隻有兩個,等的列表,但我想盡可能保持簡單。

+0

感謝Tomaka,是否有可能只捕獲日誌文件中的異常錯誤消息?在這裏,它的(CPP)客戶端應用程序。現在我想在控制檯中顯示服務器 - 客戶端連接建立的細節,並且無論什麼異常來像文件傳輸,如內存異常,...等都想寫在日誌文件中。 – 2010-07-21 09:37:35

+0

如果你在談論C++異常,你必須手動捕獲它們,所以你可以將它們重定向到文件或cerr而不是cout。但我不確定我是否真的明白你的問題 – Tomaka17 2010-07-21 09:51:21

+0

謝謝Tomkat,現在我可以使用cerr在控制檯上打印任何我想要的數據。 – 2010-07-21 12:36:39

1

實際上,您需要實時追蹤添加到應用程序寫入的日誌中的行。

在Unix世界中,有一個簡單的工具具有這個功能,它被稱爲tail

致電tail -f your_file您將看到文件內容幾乎實時顯示在控制檯中。

不幸的是,尾巴不是Windows中的標準工具(根據你問題的標籤,我想你是用它的)。 但是,它可以在GnuWin32包中找到,也可以在MSYS中找到。

也有幾個本地工具的Windows具有相同的功能,我個人使用Tail For Win32,它是根據GPL許可的。因此,總結一下,我認爲你的程序不應該把相同的數據輸出到不同的數據流中,因爲它可能會減慢它的速度而沒有真正的好處,而有一些已經設計好的專門解決這個問題的工具,沒有需要開發任何東西。

+0

+1如果解釋是正確的,我認爲,「尾巴」是要走的路 – Gianluca 2010-07-20 15:51:31

相關問題