簡體   English   中英

輸出到文件和命令行

[英]Output into file and command line

我讀到有關freopen ,該文章將所有printf重定向到文件,但是我也希望將輸出也打印在屏幕上。 有沒有一種簡單的方法可以將printfs重定向到文件並獲取cmd行輸出?

謝謝!

另一種選擇是編寫一個功能類似於printf ,但是將輸出定向到兩個不同的位置。 例如:

#include <stdio.h>
#include <stdarg.h>

void printf2(FILE *fp, char *format, ...)
{
    va_list ap;
    va_list ap2;

    va_start(ap, format);
    va_copy(ap2, ap);

    vfprintf(fp, format, ap);
    va_end(ap);

    vprintf(format, ap2);
    va_end(ap2);
}

然后,您可以printf2調用fprintf一樣調用printf2 ,輸出將同時傳遞到傳入的FILE指針和stdout:

FILE *fp = fopen("/tmp/foo", "w");
printf2(fp, "This is a test.\n");

這種方法不使用子進程或管道,並且可以根據需要將其通用化為多個文件指針。

在程序外部,使用“ tee”:

# echo foo | tee foo.txt
foo
# cat foo.txt
foo

實際上,您可以將通道popen()到可寫入文件的tee上,盡管這很累。 達到此效果的方法:

FILE *stream_to_write_to = popen( "tee filename.txt" );
fprintf( stream_to_write_to, "goes to filename.txt and stdout\n" );

我很好奇,看看是否有一種from-C的快速方法,因為在某種程度上,這涉及到復制數據。 使兩個文件句柄寫入相同的位置,使用dup()或類似方法很容易,但是相反的過程則比較棘手。 它可能涉及將模塊推入(通常的示例是“ connld”到流上),盡管老實說我從未見過使用過它,所以我很想親自看看一個有效的代碼示例。

我能給的最好的參考是Stevens的“ UNIX環境中的高級編程”。

更新:

在下面說R時,上面的解決方案是一個稍微重一點的版本,它只是fork / exec-ing並將孩子的句柄重定向到其他地方。 兩者都可以解決問題,盡管我更喜歡上面的內容,因為它更易於清理,但老實說,這兩種解決方案都相當繁重。 Fork()不是輕量級函數。 如果問題的實質是在沒有fork / exec的情況下這樣做,那么我不確定,我也想知道。 如果fork / exec沒問題,那么直接使用它或使用popen()都會對其進行破解。

對於重定向標准輸出, freopen不是一個好主意。 它不一定會重用相同的文件描述符號,因此子進程可能不會繼承新的stdout(或者最終可能根本沒有stdout)。 最好先使用open然后使用dup2close(0)然后使用open創建一個新的stdout目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM