有沒有辦法修改printf
以便在文件上而不是在控制檯上輸出字符串?C修改printf()以輸出到文件
我試着在互聯網上查找一些東西,發現像dup
,dup2
和fflush
這樣的電話可能與此有關。
編輯:
也許我不清楚..事情是,這是在C考試的問題..問題如下:
解釋了爲什麼一個程序,正常輸出字符串屏幕(使用printf()
)可以輸出字符串到一個文件,沒有更改所述程序中的任何代碼。
有沒有辦法修改printf
以便在文件上而不是在控制檯上輸出字符串?C修改printf()以輸出到文件
我試着在互聯網上查找一些東西,發現像dup
,dup2
和fflush
這樣的電話可能與此有關。
編輯:
也許我不清楚..事情是,這是在C考試的問題..問題如下:
解釋了爲什麼一個程序,正常輸出字符串屏幕(使用printf()
)可以輸出字符串到一個文件,沒有更改所述程序中的任何代碼。
這通常通過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
使用sprintf
直接寫入字符串,然後寫入文件或fprintf
。
'snprintf'幾乎總是比'sprintf'更好的選擇,以避免緩衝區溢出。 –
@DelanAzabani我同意。只是想保持簡單。 – user1202136
如果你沒有自由修改源代碼,不會打印,您可以使用freopen
上stdout
重定向到一個文件:
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;
所以這樣stdout被覆蓋,並將輸出到文件,而不是控制檯..? – user1317277
另外,您如何再次使printf打印到控制檯? – user1317277
@ user1317277是的,一旦你'freopen'你的'stdout',輸出就會進入文件。在'freopen'之後你不能回去,但你可以存儲舊的stdout,並按照我在編輯中解釋的方式將其恢復。 – dasblinkenlight
其他的答案不不改變任何代碼的這一難題。
所以,根據環境的不同,剩下的唯一東西就是調用程序時的stdout重定向。
./program > target_file
優秀..謝謝:) – user1317277
講師進行了磋商,這是提供正確的解決方案(由講師本人):
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並將其分配給第一個參數。
如果你解釋*爲什麼*你想做這件奇怪的事情,答案通常會更好。 – unwind
'fprintf'如何?或者使用shell重定向('./myprogram> some_file')? –
@JoachimPileborg ...謝謝你的回答..我將進一步探索shell重定向選項.. – user1317277