【问题标题】:Changing the file position indicator of stdout更改标准输出的文件位置指示器
【发布时间】:2012-12-23 07:34:58
【问题描述】:

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

    #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 . . . 我真的很想知道为什么。 This guy 甚至在 cplusplus.com 上问了同样的问题而没有回应

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

【问题讨论】:

    标签: c stdout


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 真的只适用于特定类型的输出设备/终端。我曾经编写过类似 VT100 终端 (en.wikipedia.org/wiki/VT100) 的代码,该终端后来成为 ANSI 标准。所以它仍然可能是一个很酷的项目,只是严重依赖系统。
      • @ReallyBadAtStuff:不要费心在文本模式下重写屏幕。相反,请参阅curses(现在称为 ncurses),了解一种独立于终端类型的方法。
      • 正如 wallyk 所说,如果你正在使用,curses 是在 Linux 上执行此操作的标准方法。
      • 哈哈,我只需要用 ncurses 做一个项目,而我的老师甚至从未教过它,他说他正在“向它挥手”。所以这是一次糟糕的经历,哈哈。我让它工作了,但 ncurses 对我来说仍然有点神秘。但我会调查一下。 Edit@ PeterJ:刚刚看到上面的评论 ncurses 只适用于 linux 吗?我所做的项目是使用 linux,但我目前正在尝试的这个项目是一台 windows 机器。
      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-11-22
        • 2014-06-29
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 2012-07-14
        • 2011-09-04
        • 1970-01-01
        相关资源
        最近更新 更多