簡體   English   中英

如何使函數 printf 在文件或控制台上輸出?

[英]How to make a function printf its output on a file or on console?

如何使函數 printf 在文件或控制台上輸出? 更具體地說,如果在主函數中我有兩種意見:1. printf 文件上的輸出或 2. printf 控制台上的輸出; 並且我有另一個具有輸出的函數,我需要將該輸出返回到主函數,對嗎? 或者還有其他方法嗎?

最簡單的方法是不使用printf而是使用fprintf 基本上printf(arg1, arg2, ...)fprintf(stdout, arg1, arg2, ...) 據我所知,無論你做什么, printf都會打印到控制台,所以如果你想重定向它,你必須在調用程序時通過 shell 來做。 在 bash 中,它類似於./a.out > file.txt 可能存在某種方法可以將標准輸出從程序內部重定向到文件,但我懷疑這不是一個非常慣用的解決方案,而只是證明理論上可行。

以下是如何使用fprintf解決此問題的示例:

int main(int argc, char ** argv)
{
    FILE * fp;

    // If the program was invoked with an argument, treat it as a filename
    // and write the output to that file. Otherwise, write to stdout.
    if(argc == 2) fp = fopen(argv[1], "w");
    else          fp = stdout;

    fprintf(fp, "Hello, world!\n");
    fflush(fp); // Make sure everything gets printed.
    fclose(fp);
}

我在這里排除了所有錯誤檢查。 你不應該。 例如,您應該檢查fopen成功。 if 語句中的條件也遠非完美。 這只是一個演示。

您可以簡單地設置一個布爾標志,如果設置了該標志,則您調用fprintf來打印到文件,否則您可以使用printf打印(它將轉到控制台)。

就像是

bool print_to_file = false;
FILE *file;

print_to_file = get_print_to_file_choice();
if (print_to_file)
    file = get_file_to_print_to();

// ...

if (print_to_file)
    fprintf(file, "some text here...\n");
else
    printf("some text here...\n");

現在上述很容易實現,但很難維護。 如果需要更改字符串怎么辦? 然后您需要記住更改fprintfprintf調用。

所以你可以把它放在一個函數中,該函數將標志和文件變量作為參數,以及格式字符串和參數。 此函數可以使用打印函數( vfprintfvprintf )的可變參數變體並在函數中執行條件。 在您的主代碼中,您可以改為調用此函數。

也許像

void my_printf(bool print_to_file, FILE *file, const char *fmt, ...)
{
    va_list va;

    va_start(va, fmt);
    if (print_to_file)
        vfprintf(file, fmt, va);
    else
        vprintf(fmt, va);
    va_end(va);
}

// ...

my_printf(print_to_file, file, "Some text here...\n");

還有其他可能的解決方案,例如使用評論中提到的freopen 或者您可以簡單地打印到stdout (使用普通的printf ),然后將 shell 或命令提示符中的輸出重定向到一個文件。

在您的情況下,您需要fprintf而不是printf

fprintf工作方式幾乎與printf類似,只是您向它傳遞了一個額外的第一個參數。 該參數是您的輸出將要降落的地方。

  1. 如果您想要文件上的輸出,請將FILE*指針作為該參數傳遞給您的文件。

  2. 如果您想要控制台上的輸出,請將stdout作為該參數傳遞。

例如,

FILE* myFile = fopen("demo.txt", "w");

int dummy = 22;

fprintf(myFile, "%d will be written in <demo.txt>", dummy);

fprintf(stdout, "%d will be written in the console", dummy);

筆記:

您不需要任何新的fprintf頭文件。 它位於定期包含的stdio.h fprintf的完整參考。

暫無
暫無

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

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