3

我试图弄乱文件位置指示器并覆盖屏幕上已经存在的内容。

    #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获得了类似的代码,唯一的区别是它们使用的是实际文件而不是标准输出。标准输出是否有一些我不知道的特殊例外。

我以为我可以将标准输出视为文件。出于某种原因,我将其作为输出:That is a sampleThisPress any key to continue . . . 我真的很想知道为什么。 这家伙甚至在 cplusplus.com 上问了同样的问题而没有回应

我知道 fseek 和 lseek ,如果它们有效,我可能会使用它们,但不管我想知道为什么上述方法不起作用。如果您有更好的方法,我愿意接受建议,但我仍然想知道我在这里做错了什么。先感谢您。

4

3 回答 3

3

如果您要实现的是将输出修改为屏幕,您可能需要查看 ncurses (或类似的东西)。

或者,如果你只是想要这样的东西(一个进度条,显示到目前为止完成的“总”工作中有多少“第 2 部分”):

....
cout << part * 100 / total << "% done\r"; cout.flush();
....

\r 是“回车”,将光标移回行首,而不向下移动。

于 2012-12-23T11:05:52.547 回答
2

当指向 tty 风格的设备时,Stdout 没有文件位置的概念,想想过去的 tty 调制解调器等,一旦发送一个字符,它就会被发送。您可以发送一系列字符以在事件发生后重新定位光标并覆盖屏幕上的文本,但具体操作方式取决于输出设备。

于 2012-12-23T07:39:32.453 回答
1

stdout如果重定向到文件,您的程序将正常工作。终端不可搜索,但磁盘文件和其他一些类型的流是可搜索的。

有一个系统调用库调用isatty(1),它被广泛支持。如果它返回 true,stdout则连接到类似终端的设备,并且不可搜索。如果为假,您通常可以依靠它工作。我以为有一个isapipe()电话,但我从未使用过它(只记得我记得在手册页中看到过),但现在我在任何地方都找不到它。管道也往往不可搜索(在大多数情况下)。

于 2012-12-23T07:47:24.217 回答