2012-06-08 69 views
4

有沒有辦法修改printf以便在文件上而不是在控制檯上輸出字符串?C修改printf()以輸出到文件

我試着在互聯網上查找一些東西,發現像dupdup2fflush這樣的電話可能與此有關。

編輯:

也許我不清楚..事情是,這是在C考試的問題..問題如下:

解釋了爲什麼一個程序,正常輸出字符串屏幕(使用printf())可以輸出字符串到一個文件,沒有更改所述程序中的任何代碼。

+0

如果你解釋*爲什麼*你想做這件奇怪的事情,答案通常會更好。 – unwind

+3

'fprintf'如何?或者使用shell重定向('./myprogram> some_file')? –

+0

@JoachimPileborg ...謝謝你的回答..我將進一步探索shell重定向選項.. – user1317277

回答

5

這通常通過I/O重定向(...> file)完成。

檢查這個小程序:

#include <stdio.h> 
#include <unistd.h> 

int main (int argc, char *argv[]) { 
    if (isatty (fileno (stdout))) 
     fprintf (stderr, "output goes to terminal\n"); 
    else 
     fprintf (stderr, "output goes to file\n"); 

    return 0; 
} 

[email protected]:~ $ ./x 
output goes to terminal 
[email protected]:~ $ ./x >yy 
output goes to file 
11

如果你沒有自由修改源代碼,不會打印,您可以使用freopenstdout重定向到一個文件:

stdout = freopen("my_log.txt", "w", stdout); 

上一劈此邊界,但是,因爲命令行重定向將停止按預期工作。如果您確實可以訪問打印的代碼,則首選使用fprintf

您也可以將您的stdout暫時函數調用,然後把它放回去:

FILE *saved = stdout; 
stdout = fopen("log.txt", "a"); 
call_function_that_prints_to_stdout(); 
fclose(stdout); 
stdout = saved; 
+0

所以這樣stdout被覆蓋,並將輸出到文件,而不是控制檯..? – user1317277

+0

另外,您如何再次使printf打印到控制檯? – user1317277

+1

@ user1317277是的,一旦你'freopen'你的'stdout',輸出就會進入文件。在'freopen'之後你不能回去,但你可以存儲舊的stdout,並按照我在編輯中解釋的方式將其恢復。 – dasblinkenlight

2

其他的答案不不改變任何代碼的這一難題。

所以,根據環境的不同,剩下的唯一東西就是調用程序時的stdout重定向。

./program > target_file 
+0

優秀..謝謝:) – user1317277

1

講師進行了磋商,這是提供正確的解決方案(由講師本人):

int main { 
    int newFile = open(desiredFilePath, O_WRONLY) 
    if ((fork())==0) { 
     dup2(newFile,stdout) // Explained below 
     close newFile 
     Set stdout as CLOSE_ON_EXEC false 
     exec the user program 
    } 
    else{ 
     Wait for child 
    } 
    return 0 
} 

背後DUP2的邏輯:在此標準輸出設置作爲newFile的副本,這意味着FD 0現在實際上是用戶需要的文件而不是控制檯。這是因爲dup 2的默認行爲是關閉第二個參數的filedescriptor並將其分配給第一個參數。