我正在使用C++编写文件共享应用程序。我想将控制台输出写入一个单独的文件,同时我也想在控制台中看到输出。任何人都可以帮助我...提前致谢。如何在C++中将控制台数据写入文本文件?
回答
我不用C++编程,但这里是我的建议:创建一个新的类,该类需要InputStream(C++或smth中的istream),并且每个传入的字节都将在std.out和文件中传输。
我确信有一种方法可以用前面提到的类来改变标准输出流。我记得,std.out是cout的某种属性。
再次,我花了一个多星期前在C++上花了一周时间,所以有机会我所说的只是垃圾。
在这里,我们去...
#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:好吧,看你的问题错(控制台输出/输入查询股价),但你仍然有想法,我认为。
这个想法是创建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而不是只有两个,等的列表,但我想尽可能保持简单。
感谢Tomaka,是否有可能只捕获日志文件中的异常错误消息?在这里,它的(CPP)客户端应用程序。现在我想在控制台中显示服务器 - 客户端连接建立的细节,并且无论什么异常来像文件传输,如内存异常,...等都想写在日志文件中。 – 2010-07-21 09:37:35
如果你在谈论C++异常,你必须手动捕获它们,所以你可以将它们重定向到文件或cerr而不是cout。但我不确定我是否真的明白你的问题 – Tomaka17 2010-07-21 09:51:21
谢谢Tomkat,现在我可以使用cerr在控制台上打印任何我想要的数据。 – 2010-07-21 12:36:39
实际上,您需要实时追踪添加到应用程序写入的日志中的行。
在Unix世界中,有一个简单的工具具有这个功能,它被称为tail
。
致电tail -f your_file
您将看到文件内容几乎实时显示在控制台中。
不幸的是,尾巴不是Windows中的标准工具(根据你问题的标签,我想你是用它的)。 但是,它可以在GnuWin32包中找到,也可以在MSYS中找到。
也有几个本地工具的Windows具有相同的功能,我个人使用Tail For Win32,它是根据GPL许可的。因此,总结一下,我认为你的程序不应该把相同的数据输出到不同的数据流中,因为它可能会减慢它的速度而没有真正的好处,而有一些已经设计好的专门解决这个问题的工具,没有需要开发任何东西。
+1如果解释是正确的,我认为,“尾巴”是要走的路 – Gianluca 2010-07-20 15:51:31
- 1. 从java中将控制台输出写入文本文件
- 2. 将控制台线写入文件
- 3. 将Ruby控制台输出写入文本文件
- 4. 如何将控制台输出写入cpp中的文本文件?
- 5. Ruby - 如何将控制台输入写入文件
- 6. 如何在控制台项目中重写一行文本? C++
- 7. 在写入文件后无法在控制台中写入
- 8. 如何在python中将数据写入文本文件?
- 9. 如何在python中将数据写入文本文件?
- 10. 将控制台的输出写入C#文件?
- 11. 如何将数据写入到php中的文本文件中
- 12. 如何在Python中将二进制数据写入文本文件?
- 13. 在C++中,如何将几行文本输出到控制台?
- 14. log4j2不写入控制台和文件
- 15. 无法在文本文件中编写控制台输出
- 16. 如何在控制台应用程序中将值永久写入app.config文件?
- 17. 将文本框中的数据写入文本文件
- 18. 如何在fasm中写入控制台?
- 19. 如何在Python中将文本列表写入文本文件
- 20. 如何在C#控制台应用程序中将数据写入文本文件而不覆盖当前数据
- 21. 将二进制数据写入文件
- 22. c - 将数据写入wav文件
- 23. c#将数据写入rtf文件
- 24. C#将数据写入CSV文件
- 25. C#WinForm,如何在文本框中将当前文本写入新文件
- 26. 如何将数据写入BlackBerry的文本文件?
- 27. 如何将数据写入文本文件无需排序
- 28. 如何使用ANSI格式将数据写入文本文件
- 29. 如何使用JavaScript将数据写入文本文件
- 30. 如何将数据写入Arduino上的文本文件
'我
Johnsyweb
2010-07-20 13:20:01
@Johnsywen:谢谢,纠正。 – rubenvb 2010-07-20 13:21:11