2017-09-05 75 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以瞭解執行此操作的一種方法。