2014-08-28 40 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; 

在我看来,目前尚不清楚这种方法是否比你的要好,虽然。