我正在试图弄乱文件位置指示器并写下屏幕上已有的内容。
#include <stdio.h>
int main ()
{
fpos_t position;
fgetpos (stdout, &position);
fputs ("That is a sample",stdout);
fsetpos (stdout, &position);
fputs ("This",stdout);
return 0;
}
我想要这个“这是一个样本”。我在cplusplus.com之后得到了类似的代码,唯一的区别是它们使用的是实际文件而不是标准输出。 stdout是否有一些我不知道的特殊例外。
我以为我可以将stdout视为文件。出于某种原因,我将其作为输出:That is a sampleThisPress any key to continue . . .
我真的想知道原因。 This guy甚至在cplusplus.com上没有回复就问过同样的问题
我知道fseek和lseek,如果他们工作,我可能会使用这些,但不管我想知道为什么上述不起作用。如果你有更好的方法,我愿意接受建议,但我仍然想知道我在这里做错了什么。提前谢谢。
答案 0 :(得分:2)
当指向tty样式设备时,Stdout没有文件位置的概念,想想tty调制解调器的旧时代等,并且一旦发送了一个字符就发送它。您可以发送一系列字符以在事件之后重新定位光标并覆盖屏幕上的文本,但是如何执行此操作取决于输出设备。
答案 1 :(得分:2)
如果您要实现的是将输出修改为屏幕,您可能需要查看ncurses(或类似的东西)。
或许,如果你只是想要这样的东西(一个进度条,显示“part2”到目前为止完成的“总”工作量):
....
cout << part * 100 / total << "% done\r"; cout.flush();
....
\ r \ n是“回车”,会将光标移回到行首,而不会向下移动。
答案 2 :(得分:1)
如果将stdout
重定向到文件,您的程序将有效。终端不可搜索,但磁盘文件和其他类型的流是可以搜索的。
系统调用库调用isatty(1)
,受到广泛支持。如果返回true,则stdout
连接到类似终端的设备,并且不可搜索。如果错误,通常可以依赖它工作。我以为有一个isapipe()
电话,但我从未使用它(只是想到我记得在手册页中看过它),但我现在没有找到它。管道往往也不可寻找(在大多数情况下)。