2010-07-20 330 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

相关问题