我正在使用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