2014-08-28 59 views
1

我正在用MPI編寫一個C++程序(C接口,沒有提升等)。在我的程序中,我有許多輸出,可以輸出到文件,也可以只輸入0級。是否有避免 寫入if (rank == 0) cout << string的好方法?避免重複if語句在C++中的C++ MPI

但是也有一些我的電腦我的MPI實現的工作方式有兩種,但都有些站不住腳對我說:

if (rank != 0) 
    cout.setstate(ios_base::badbit); 

這樣有效地禁止所有等級,但0輸出,但允許嗎?如果我這樣做會有問題嗎?

另一個想法是創建一個未打開的ofstream,並將輸出重定向到那裏。

ostream* os; 
ofstream nullstream; 
if (rank == 0) 
    os = &cout; 
else 
    os = &nullstream; 
*os << "rank " << rank << endl; 

這使得處於錯誤狀態nullstream,而且也有效地禁止在不是所有的行列輸出0 ...

這個問題似乎常見於我,所以我很抱歉,如果它是已經在其他地方回答了。我沒有通過搜索找到答案,並且很高興對任何現有問題進行重定向。

回答

1

如果你願意犧牲便攜性的Windows系統,爲靜音POSIX系統上的輸出正確的方法是將重定向標準輸出(以及可選的標準誤差),以/dev/null

int main() { 
    ... 
    std::ofstream sink("/dev/null"); 

    if (rank != 0) { 
    // Mute standard output 
    std::cout.rdbuf(sink.rdbuf()); 
    // Optionally mute standard error 
    std::cerr.rdbuf(sink.rdbuf());  
    } 

    no_output_from_other_ranks_from_now_on(); 
    ... 
} 

改編自this answer

0

我通常以某種方式使用預處理器宏,例如,

#define COUT if(rank == 0) std::cout 

然後,您只需編寫

COUT << string; 

在我看來,目前尚不清楚這種方法是否比你的要好,雖然。