将c++标准输入从键盘更改为另一个设备
Change C++ stdin from keyboard to another device
我读到过c++中的std::cin
(我在这里转述)"从标准输入流中获取输入,通常是键盘"。
如何改变它以允许其他设备提供输入?我不知道我会用它做什么目的,但我很好奇如何做到这一点。
(我确信答案在某个地方,但搜索了一段时间后,我还没有找到它;如果你知道一个很好的资源可以回答我的问题,我将非常感激,如果你能告诉我它是什么。
更新:除非我问的问题在正常的c++中是不可能的,否则这不是一个重复的问题。我不希望将stdin
/stdout
重定向到文件;我想知道是否有可能将它重定向到其他设备,如鼠标或游戏控制器
从其他输入设备读取的方式是特定于设备的。你必须使用你正在使用的平台上的api;每个平台上的api是不同的。
如果你真的很好奇,你可以谷歌搜索"c++鼠标输入"或"c++操纵杆输入"(甚至是"c++键盘输入",用于低级键盘处理)来找到你想要的细节。在搜索中添加"Windows"、"Linux"或"Mac",可以找到适合你的特定平台的结果。
注意,你可以在Stack Exchange game development网站上找到一些优秀的低级设备控制,适合游戏开发。
Windows api在Windows上,低级设备输入要求你使用Windows事件处理系统,并处理你的应用程序需要的特定事件。Microsoft在Windows Dev Center上记录了底层api。
具体的api有:
- 键盘:键盘输入和键盘输入通知
- 鼠标:鼠标输入和鼠标输入通知
- 游戏控制器:DirectInput
Mac OS X
在Mac上处理低级输入事件与在Windows上不同,Mac Developer Library上的文档通常是用Objective C而不是c++呈现的。值得注意的是,在Mac OS X上,XCode将允许你编写c++/Objective C的混合代码,称为Objective c++,所以你可以很容易地利用你的c++经验。
单个api如下:
- 键盘:处理关键事件
- 鼠标:处理鼠标事件
- 游戏控制器:没有标准的API,但你可以在Mac上的支持控制器和Mac OSX上使用PS3控制器输入中找到一些细节
Linux(和其他类unix系统)可以支持X11、KDE或Gnome gui,因此这些gui都有自己的api。我不会在这里列举它们,但是如果你想为Linux、FreeBSD、OpenBSD或任何其他Unix变体开发,你可以很容易地找到适合你的api。
抽象库/框架
有许多库(C)和框架(c++)为低级输入和输出提供跨平台接口。有些做得很好,得到了广泛的支持,并且经常有游戏引擎构建在它们之上。
一些非常常见且支持良好的库有:
- Simple DirectMedial Layer (SDL)
- 快板
- GLFW
- SFML
还有一些可移植的框架,通常用于开发更传统的应用程序,这些框架还提供了处理用户输入的抽象:
- wxWidgets(原wxWindows)
- Qt
- JUCE 终极+ +
如果你稍微挖掘一下,你可以找到很多很多可移植的库和框架。它们不仅通常使开发复杂逻辑变得更容易,而且还将使您的代码完全在另一个平台上构建和运行具有显著的优势。
通常,您在启动程序之前更改它。例如,标准输入可能来自文件:
./my_program </some/file/name
或从另一个进程:
/some/other/program | ./my_program
您可以在程序中更改stdin,但这几乎总是错误的做法,并且会使从事该工作的其他人感到惊讶¹。如果您正在编写需要执行输入的可重用代码,我建议您将输入流(或文件描述符,或FILE*
,如果您使用C)传递到您的函数中,以允许外部代码打开自己的文件,如果它想要(可能不止一个文件,也可能是管道或套接字…)
¹"别人"通常可以理解为"6个月后的自己"…
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 运行同一解决方案的另一个项目的项目
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- C++从另一个类访问公共静态向量的正确方法是什么
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 使用std::transform将一个范围的元素添加到另一个范围中
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- C++试图读取一个文件并输出到另一个文本文件
- 如何将指针从一个void函数传递到另一个C++
- 如何从另一个文件继承私有成员变量和公共函数
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 在 Windows 上,是否可以让 dll 在不使用 PATH 环境变量的情况下在另一个文件夹中查找依赖项?
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++-我可以创建另一个类的成员并在构造函数中使用它吗
- 如何在C++中将函数发送到另一个进程
- 如何通过按下第三个窗口中的按钮,将QString从一个窗口获取到另一个窗口