【问题标题】:Alternative function in iostream.h for getch() of conio.h?iostream.h 中用于 conio.h 的 getch() 的替代函数?
【发布时间】:2010-11-25 12:46:03
【问题描述】:

我正在尝试使用头文件<iostream.h> 将屏幕保留在我的输出上,但我不知道<iostream.h><conio.h>getch()clrscr() 函数的任何等效函数或任何其他 C++ 库。有这样的功能吗?

【问题讨论】:

  • 在 C++ 中,标头只是 #include <iostream>不是 #include <iostream.h>
  • <iostream> 可能是标准但clrscr() 不是标准,因此在非标准标头中找到它实际上是有意义的。
  • 其实我一直想问,为什么有些人总是先用 clrscr() 开始一个程序,然后用 getch() 结束。
  • 相关帖子 - getch is deprecated

标签: c++ iostream


【解决方案1】:

conio.h 函数是该语言的编译器扩展,不是 C 或 C++ 的一部分。标准 C++ 中没有直接替代品。

对于 getch(),int ch = std::cin.get(); 可能是最接近的等价物——但请记住,这将从缓冲的标准输入中读取,而我认为 conio.h getch 会进行无缓冲读取。

clrscr() 的任何实现都将非常依赖于平台——并非所有屏幕或终端都有清除的概念,而且那些确实有完全不同的方式来访问该功能。

如果您需要将终端视为一组字符流以外的东西,那么您最好的选择可能是寻找一个库来隐藏底层终端、屏幕或控制台的详细信息。如果您使用的是 UNIXish 系统,请查看 curses 或 ncurses 库;我不知道对其他操作系统有什么建议。

【讨论】:

    【解决方案2】:

    getch() 和 clrscr() 将适用于 C++。包括 conio.h

    但是,如果您不能(出于某种原因)包含 conio.h,

    cin>>dummy_var 会显示一条要求用户按回车的消息吗?

    【讨论】:

    • +1 因为您可以用 C 和 C++ 做的最有趣的事情实际上不在标准中。这两个标准都不是完整的,而且您可以包含除标准规定的标头之外的标头这一事实在很大程度上是设计使然。
    【解决方案3】:

    只需使用 cin.get();

    【讨论】:

      【解决方案4】:

      只需使用这两个功能:

      fflush(stdin);
      getchar();
      

      Visual Studio 和 Dev C++ 将其包含在其 iostream 标头中,因此无需包含额外的头文件。

      【讨论】:

      【解决方案5】:

      这是我常用的:

      #include<iostream>
      ...
      std::getchar();
      

      【讨论】:

        【解决方案6】:

        迟到的答案,您可以使用std::cin.get(),这应该适用于大多数编译器。如果这不起作用,请尝试添加另一个。

        int main () {
        
            // ...
        
            std::cin.get();
            std::cin.get();
            return 0x00;
        }
        

        使用system("PAUSE") 仅在Windows 上可用,并且是bad 编程habit。原因是它确实暂停冻结您的程序,而不是仅仅等待输入。 IE。按键退出。

        【讨论】:

          【解决方案7】:

          我知道这是一个老问题,但我还是会回答,因为人们可能正在寻找类似问题的答案。

          conio.h 是一个(古老的)Windows 和 MS-DOS/PC-DOS C 库,过去现在仍然用于 Windows/DOS 环境中非常基本的裸机键盘输入和处理。

          getch()clrscr() 都是此标头的非标准添加,对于标准 C 函数应尽可能避免。 getch() 通常可以替换为 C 中的 scanf()fread() 和 C++ 中的 std::cinstd::cin.get。至于clrscr(),你能得到的最接近的是:

          for(int i = 0; i < 100; i++)
          {
              printf("\n");
          }
          

          或:

          在 *nix 环境中还有 ncurses.hHere's a link 提供一些相关信息。

          【讨论】:

            【解决方案8】:

            conio.h 中的平台特定函数getch() 有两个特殊功能:

            • 没有回显个字符。
            • 无缓冲字符读取。

            回显由 C/C++ 环境之外的终端完成。它只能通过操纵终端来控制。此外,几乎不可能使用 iostream.h 标头获得无缓冲的 I/O。

            因此,仅使用 iostream.h 无法到达 getch() 附近。

            (周围有很多 getch()implementations,例如使用 termios.h 禁用回显。)

            【讨论】:

            • 谢谢,这正是我要搜索的信息。
            【解决方案9】:

            对于clrscr()我一般用

            system("cls");       //Windows
            system("clear");     // Linux
            

            对于 getch() 函数,我同意 @iKlsR ,只需使用 cin.get() 2 次。

            {   ...
                std::cin.get();
                std::cin.get();
            }
            

            如果您希望暂停系统片刻或特定时间间隔,请使用:

            system("sleep 5s"); //for linux
            

            基本上函数system("x") 在终端运行命令x。所以你可以通过使用不同的函数代替x来利用它。 (具体使用与您的发行版或操作系统相关的命令)

            【讨论】:

              【解决方案10】:

              您可以使用 system("pause"),它会产生“按任意键继续”消息。但它仅适用于 windows 环境。我认为所有“系统”命令都是dos命令。如果我错了,请纠正我

              【讨论】:

              • 你说对了一半。 system(&lt;cmd&gt;) 使用您当前使用的任何操作系统的命令处理器执行 &lt;cmd&gt;Reference。它通常也被认为是不好的形式,因为它不能在平台之间移植。
              【解决方案11】:

              如果您在 Windows 上工作,您可以使用 system("pause"),这将给您“按任意键继续”消息。

              【讨论】:

              • 这可行,但它是bad habit to get into
              • 根本不应该使用这个。
              • 这里还有一个std::cin.ignore();
              猜你喜欢
              • 1970-01-01
              • 2020-11-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-04-07
              相关资源
              最近更新 更多