2017-09-05 76 views
3

嗨,你们所有的你们精彩的程序员。 我一直在试图使例如执行代码std :: cout重定向的范围

std::cout << "hello" << std::endl; 

单词“hello”将被写入我重定向到文件时std::cout重定向到一个文件。

我有followig程序:

// Redirection.cpp 
#include <iostream> 
#include <fstream> 

int main(int argc, char **argv) { 
    if(argc == 2){ 
     std::cout << "Output file supplied, redirecting to output.txt" << std::endl; 
     std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt"); 
     std::cout.rdbuf(out.rdbuf()); 
     std::cout << "This file contains output of Redirection.cpp" << std::endl; 
    } 
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl; 
    return 0; 
} 

我期待output.txt阅读:

This file contains output of Redirection.cpp 
This should be displayed in console or in the output file, if supplied 

而是只写着:

This file contains output of Redirection.cpp 

我的身影,重定向我使用仅适用于该范围,而不适用于任何外部范围。

我该如何解决这个问题?我需要的行为是,只有在提供输出文件时,所有打印才会写入该文件而不是控制台。

非常感谢您的支持!

+2

不,你的'out'对象超出了范围.. – WhiZTiM

+0

你真的需要额外的东西,'std :: endl'吗? ''\ n''结束一行。 –

+0

嗨皮特。我不这么认为,但这是他们在课堂上问我们的。谢谢! – avneraggy

回答

3

if之外声明cout变量,以便在if结束时它不会超出范围。

int main(int argc, char *argv[]) { 
    std::ofstream out; 
    if (argc == 2) { 
     std::cout << "Output file supplied, redirecting to output.txt" << std::endl; 
     out.open("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt"); 
     std::cout.rdbuf(out.rdbuf()); 
     std::cout << "This file contains output of Redirection.cpp" << std::endl; 
    } 
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl; 
    if (out.is_open()) { 
     out.close(); 
    } 
    return 0; 
} 
+0

你不需要关闭'out'。它的析构函数将会这样做。 –

4
#include <iostream> 
#include <fstream> 

int main(int argc, char **argv) { 
    if(argc == 2){ 
     std::cout << "Output file supplied, redirecting to output.txt" << std::endl; 
     std::ofstream out("C:\\Avner\\HUJI\\CPP\\ex2\\output.txt"); 
     std::cout.rdbuf(out.rdbuf()); 
     std::cout << "This file contains output of Redirection.cpp" << std::endl; 
    } 
    std::cout << "This should be displayed in console or in the output file, if supplied" << std::endl; 
    return 0; 
} 

回想out自动存储持续时间的对象。因此,在最后std::cout操作之前的“}”,out被破坏(结果是缓冲区和文件资源被释放)。

因此,要确保流缓冲区仍然有效,请保留out存活。请参阅Barmar's answer以了解执行此操作的一种方法。