iostream.h中与conio.h的getch()相对应的替代功能是什么?

27

我正在尝试使用头文件 <iostream.h> 保持输出屏幕,但是我不知道在 <iostream.h> 或其他C++库中是否有与 <conio.h> 中的 getch()clrscr() 函数等效的函数。 是否存在这样的函数?


9
在C++中,头文件只需写成#include <iostream>,而不是#include <iostream.h> - GManNickG
<iostream> 可能是标准的,但 clrscr() 并不是标准的,所以在非标准的头文件中找到它其实是有道理的。 - MSalters
2
我一直很好奇并且想问为什么有些人总是从clrscr()开始程序,然后以getch()结束。 - UncleBens
相关帖子 - getch已被弃用 - RBT
11个回答

30
conio.h 函数是编译器对语言的扩展,不是 C 或 C++ 的一部分。标准 C++ 中没有相应的直接替换方法。
对于 getch(),可能最接近的等效方法是 int ch = std::cin.get();。但请注意,这将从缓冲的标准输入读取,而我认为 conio.h 的 getch 是无缓冲读取。
任何一个 clrscr() 的实现都会非常依赖于平台——并非所有屏幕或终端都有清除概念,并且那些具有清除功能的方式各不相同。
如果您需要将终端视为其他字符流集之外的内容,则最好寻找一个库,该库可隐藏底层终端、屏幕或控制台的详细信息。如果您在 UNIXish 系统上,请查看 curses 或 ncurses 库;我不知道其他操作系统的建议。

9

getch()和clrscr()可以在C++中使用,需要包含conio.h头文件。

但是,如果由于某些原因无法包含conio.h头文件,

那么可以尝试使用cin>>dummy_var命令,并显示提示信息要求用户按回车键。


11
+1因为使用C和C++进行的最有趣的事情通常不在标准中。标准并不意味着是完整的,而且您可以包括除标准规定的头文件之外的其他头文件,这是非常合理的设计。 - MSalters

8
只需使用cin.get();。

3

只需使用这两个函数:

fflush(stdin);
getchar();

Visual Studio和Dev C++在它们的头文件中包含了这个,所以不需要包含额外的头文件。


6
在C标准7.18.5.2/2中,fflush(stdin)是未定义行为。 - legends2k

3

这是我通常使用的:

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

2
晚回答,您可以使用 std::cin.get(),这应该适用于大多数编译器。如果不起作用,请尝试添加另一个。
int main () {

    // ...

    std::cin.get();
    std::cin.get();
    return 0x00;
}

使用 system("PAUSE") 只适用于 Windows 平台,是一种不好的编程习惯。原因在于它会暂停冻结你的程序,而不是等待输入,例如按键退出。

1

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

conio.h 是一个(古老的)Windows和MS-DOS/PC-DOS C库,被用于在Windows/DOS环境下进行非常基本的、裸机的键盘输入和处理。

getch()clrscr() 都是该头文件的非标准添加项,应尽可能避免使用标准C函数。在C中,getch()通常可以用scanf()fread()替换,在C++中可以用std::cinstd::cin.get替换。至于clrscr(),你可以得到最接近的替代方式:

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

或者:

*nix环境下也有ncurses.h这里是一些相关信息的链接


1
平台特定的函数getch()来自conio.h,具有两个特殊功能:
  • 字符不会被回显
  • 无缓冲读取

回显是由C/C++环境外的终端完成的。它只能通过操作终端进行控制。另外,使用iostream.h头文件几乎不可能获得无缓冲I/O。

因此,仅使用iostream.h根本不可能接近getch()

(有很多getch()实现,例如使用termios.h禁用回显.)


谢谢,这正是我正在寻找的信息。 - Peter

1

对于 clrscr(),我通常使用

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

对于 getch() 函数,我同意 @iKlsR 的看法,只需使用 cin.get() 两次即可。

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

如果您想要暂停系统一段时间,可以使用以下代码:

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

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

-6
你可以使用system("pause")命令来产生"按任意键继续"的提示信息。但它只适用于Windows环境。我认为所有的"system"命令都是dos命令,如果我错了请指正。

1
你说的有一半是对的。system(<cmd>)会使用当前操作系统的命令处理器来执行<cmd>参考链接。但这种方式通常被认为是不好的,因为它在不同平台之间不具备可移植性。 - dwurf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接