如何将“\r”打印到文件
How to print "\r" to a file
我想在我的程序中显示一个进度条,所以我添加了这个
#include <stdio.h>
#include <unistd.h>
int main() {
puts("begin");
for (int i = 0; i < 100; i++) {
printf("%d%% finished.\r", i);
fflush(stdout);
usleep(100000);
}
puts("end");
}
当它输出到 stdout
时,它会很好地显示一条指示当前进度的线。
但是,如果我将它的输出定向到一个文件,那么所有带有 printf("%d%% finished.\r", i);
的行都会丢失。
是否可以将所有行保存在一个文件中?
当输出被重定向到一个文件时,你不能真正使用这样的格式,因为到文件的输出只向前写入,它永远不会向后写入。
如果您使用的是 POSIX 系统(例如 Linux 或 macOS),那么您可以使用 isatty
来检测您是否写入了实际的终端,然后更改您的输出格式相应。
输出文件中的行不太可能丢失,但有可能将文件复制到终端的速度如此之快,以至于每一行都覆盖了前一行,而您没有机会看到它。与您的程序不同,cat
不会在行间暂停。只有最后一行在最后可见,如果它至少与前面的一样长。
使用od -x
以十六进制转储文件以检查实际文件内容。
我想在我的程序中显示一个进度条,所以我添加了这个
#include <stdio.h>
#include <unistd.h>
int main() {
puts("begin");
for (int i = 0; i < 100; i++) {
printf("%d%% finished.\r", i);
fflush(stdout);
usleep(100000);
}
puts("end");
}
当它输出到 stdout
时,它会很好地显示一条指示当前进度的线。
但是,如果我将它的输出定向到一个文件,那么所有带有 printf("%d%% finished.\r", i);
的行都会丢失。
是否可以将所有行保存在一个文件中?
当输出被重定向到一个文件时,你不能真正使用这样的格式,因为到文件的输出只向前写入,它永远不会向后写入。
如果您使用的是 POSIX 系统(例如 Linux 或 macOS),那么您可以使用 isatty
来检测您是否写入了实际的终端,然后更改您的输出格式相应。
输出文件中的行不太可能丢失,但有可能将文件复制到终端的速度如此之快,以至于每一行都覆盖了前一行,而您没有机会看到它。与您的程序不同,cat
不会在行间暂停。只有最后一行在最后可见,如果它至少与前面的一样长。
使用od -x
以十六进制转储文件以检查实际文件内容。