我正在編寫單元測試,因此無法更改我正在測試的文件中的代碼。我正在測試的代碼中包含cout中的消息,我試圖將其重定向到一個文件中,以檢查該程序是否正在輸出正確的消息。有沒有人有辦法將stdout重定向到另一個不會造成延遲的程序?我試過freopen(),並導致我的程序因某種原因掛起。從C++中的另一個程序重定向stdout
3
A
回答
2
您可以創建一個filebuf
然後更換cout
的流緩衝吧:
{
std::filebuf f;
f.open("output.txt", std::ios::out);
std::streambuf* o = std::cout.rdbuf(&f);
std::cout << "hello" << std::endl; // endl will flush the stream
std::cout.rdbuf(o);
}
您需要恢復cout
「再次的原始流緩衝(或將其設置爲空指針),或者它可能會在崩潰全球流被刷新並銷燬,因爲filebuf
已經超出範圍。
1
您可以使用'open()'和'dup2()'。你可以使用下面提供的助手。如何使用它們的例子:
void
code_to_test()
{
std::cout << "Here we go" << std::endl;
std::cerr << "Danger danger" << std::endl;
}
run_test(code_to_test);
的run_test
幫手調用重定向,並運行測試代碼。
template <typename TEST> void
run_test (TEST t, bool append = false) {
flush_output();
Redirect o(1, "/tmp/test_stdout", append);
Redirect e(2, "/tmp/test_stderr", append);
t();
flush_output();
}
flush_output
幫助器刷新流。
void flush_output() {
fflush(stdout);
fflush(stderr);
std::cout.flush();
std::cerr.flush();
}
Redirect
類在構造函數中影響重定向。它將原始描述符恢復到析構函數中。
class Redirect
{
int m_what;
int m_old_what;
public:
Redirect (int what, std::string where, bool append = false)
: m_what(what), m_old_what(dup(what)) {
int flags = O_CREAT|O_WRONLY;
if (append) flags |= O_APPEND;
int f = open(where.c_str(), flags, 0660);
dup2(f, m_what);
close(f);
}
~Redirect() {
dup2(m_old_what, m_what);
close(m_old_what);
}
};
相關問題
- 1. 重定向stdout在另一個線程
- 2. 將C程序中的stdin重定向到另一個進程
- 3. 如何將一個進程的stdout重定向到另一個進程的stdin?
- 4. 將一個進程對象的stdout重定向到另一個進程對象
- 5. 將一個進程的stdout重定向到兩個進程
- 6. 爲每個線程重定向stdout/stderr
- 7. 通過Zeromq在C中重定向stdout
- 8. 重定向stdout/stderr在C中運行
- 9. 如何將stdout重定向回到多進程c程序中的終端?
- 10. 應用程序重定向到另一個應用程序
- 11. C++ WxWidgets:通過多個線程將Stdout重定向到wxTextCtrl
- 12. 如何將stdout重定向到一個子進程的stdin?
- 13. 使用stdout重定向的Python子進程返回一個int
- 14. 重定向到Windows應用程序c中的另一個窗體#
- 15. 將stdout和stderr重定向到C++中的單個文件
- 16. c#重定向(管道)進程輸出到另一個進程
- 17. 嘗試重定向到從另一個
- 18. 重定向從MXML到另一個MXML
- 19. 將用戶從應用程序重定向到另一個應用程序
- 20. 如何將程序的stdout和stderr重定向到一個文件,並將同一個stderr重定向到另一個文件?
- 21. 將輸出從stdout重定向到一個字符串?
- 22. Tcl輸出從stdout重定向到一個文件
- 23. 如何從POST方法重定向到web.py中的另一個處理程序
- 24. 如何從android中的按鈕重定向到另一個應用程序?
- 25. 另一個JavaScript重定向
- 26. 從同一個C程序中讀取stdout
- 27. 將子進程stderr重定向到stdout
- 28. C程序中的I/O重定向
- 29. 從重定向的STDOUT(C++,Win32 API,Qt)讀取Unicode
- 30. 將perl中的STDOUT/STDERR重定向到一個txt文件?
這可能是有點OS特定.. –
考慮[這裏](http://stackoverflow.com/questions/3661106/overlapped-readfileex-on-child-process-redirected-stdout-never-fires )。絕對不是一個愚蠢的,但相關的。可能有幫助。 –
此問題已答覆[這裏](http://stackoverflow.com/questions/5257509/freopen-equivalent-for-c-streams)。 – jxh