2013-04-04 55 views
0

我有以下計劃,困惑如何標準輸入,輸出和錯誤的工作

void Print() 
{ 
    printf("\nCall from Print\n"); 
} 

int main() 
{ 
    FILE * pFile; 
    char mystring [100]; 

    pFile = freopen ("myfile.txt" , "r", stdin); 
    if (pFile == NULL) 
    { 
     perror ("Error opening file"); 
    } 
    else 
    { 
     if (fgets (mystring , 100 , pFile) != NULL) 
     { 
      freopen("myfile.txt" , "a", stdout); 
      Print(); 
      printf("Here it is\n"); 
      //puts (mystring); 
     } 
     fclose(stdout); 
     fclose (pFile); 

    } 
    printf("Hello World\n"); 
    return 0; 
} 

現在,當我execting程序我不能看到控制檯窗口輸出。所有輸出都重定向到myfile.txt文件。我希望輸出應該同時出現在consolemyfile.txt之間。

畢竟這是爲什麼printf("Hello World\n")沒有得到控制檯打印。 如何使它在控制檯中打印?

我上午在Windows的7個工作時,Visual Studio 2010

回答

3

freopen("myfile.txt" , "a", stdout); 

會讓你stdout輸出到文件myfile.txt 此功能將控制檯輸出重定向到文件myfile.txt

即使你使用fclose(stdout);,這不會退縮輸出標準輸出到控制檯它只會關閉myfile.txt

參考以下鏈接瞭解更多詳情Strange behaviour when redirecting stdout in C

爲了在控制檯和文件中都得到輸出,您必須保持stdout不觸發,不要用freaopen()重新打開它,並且不要關閉它。並且您必須在文件和標準輸出中兩次打印您的消息

+0

爲什麼'printf(「Hello World \ n」)'不起作用 –

+0

你已經改變了標準輸出並且你已經關閉了它。 – MOHAMED

+0

@MOHAMMED:我的問題是爲什麼'printf(「Hello World \ n」)'沒有被打印到控制檯 –

3

最簡單的辦法是更明確這個問題,通過手動打印到兩個stdout(原,得到輸出到控制檯)和到你的文件。

通過重新打開stdout指向該文件,可以刪除與控制檯窗口的連接,這就是沒有輸出的原因。

您也可以只有使用stdout,並使用外部工具(如tee)將輸出複製到文件中。

+0

: - 這可以通過'boost'和'unix'完成。但如何處理Visual Studio 2010? –

0

我也曾經遇到過這樣的需求。

我已經爲這樣的打印日誌做了一個宏。該打印宏在一個函數中展開,該函數根據某些控制變量設置在我的日誌文件和stdout或stderr中打印該消息。

+0

: - 您是否可以擴大您的評論位 –

相關問題