[英]How can i use printf(“\b”) to make my console output look like typewriter?
[英]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");
現在上述很容易實現,但很難維護。 如果需要更改字符串怎么辦? 然后您需要記住更改fprintf
和printf
調用。
所以你可以把它放在一個函數中,該函數將標志和文件變量作為參數,以及格式字符串和參數。 此函數可以使用打印函數( vfprintf
和vprintf
)的可變參數變體並在函數中執行條件。 在您的主代碼中,您可以改為調用此函數。
也許像
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
類似,只是您向它傳遞了一個額外的第一個參數。 該參數是您的輸出將要降落的地方。
如果您想要文件上的輸出,請將FILE*
指針作為該參數傳遞給您的文件。
如果您想要控制台上的輸出,請將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.