【问题标题】:C++ : initialize input programmaticallyC++:以编程方式初始化输入
【发布时间】:2015-02-23 17:02:42
【问题描述】:

如果我们有这个代码 sn-p:

int a;
cout << "please enter a value: "; 
cin >> a;

在终端中,输入请求看起来像这样

please enter a value: _

如何以编程方式模拟用户的输入。

【问题讨论】:

  • 搜索输入/输出重定向。许多 shell 支持像 program &lt; foo 这样的语法来从名为“foo”的文件中读取输入。
  • 发送一个字符后跟一个换行符?
  • 如何使用通用的std::istream 引用,“模拟”时使用std::istringstream,不使用时使用std::cin
  • @KiraSan 看起来这不会有助于解决您的问题。也许您应该澄清更多,这里现有的建议为何以及如何无助于解决您的问题。
  • @KiraSan 已经在下面的答案中给出了。

标签: c++ linux terminal


【解决方案1】:

这是一个示例,如何使用 rdbuf() 函数操作 cin 的输入缓冲区,以从 std::istringstream 检索虚假输入

#include <iostream>
#include <sstream>
#include <string>
using namespace std;

int main() {

    istringstream iss("1 a 1 b 4 a 4 b 9");
    cin.rdbuf(iss.rdbuf());  // This line actually sets cin's input buffer
                             // to the same one as used in iss (namely the
                             // string data that was used to initialize it)
    int num = 0;
    char c;
    while(cin >> num >> c || !cin.eof()) {
        if(cin.fail()) {
            cin.clear();
            string dummy;
            cin >> dummy;
            continue;
        }
        cout << num << ", " << c << endl;
    }
    return 0;
}

See it working


另一种选择(更接近 Joachim Pileborg 在his comment IMHO 中所说的)是将您的阅读代码放入单独的函数中,例如

int readIntFromStream(std::istream& input) {
    int result = 0;
    input >> result;
    return result;
}

这使您可以对测试和生产有不同的调用,例如

// Testing code
std::istringstream iss("42");
int value = readIntFromStream(iss);

// Production code
int value = readIntFromStream(std::cin);

【讨论】:

  • 我们可以将那个虚假输入传递给用户,以便他可以修改它吗?
  • 一个很好的类比我想要得到的是谷歌浏览器中的网络登录信息,当你进入登录页面并且你的用户名存储在 Chrome 中时,它将直接初始化输入字段使用该用户名,您可以对其进行编辑。希望这能澄清我的观点。
  • 是的! shell 历史也是一个很好的类比。这就是为什么我问是否有人有一个关于如何使用 readline 并在将控制权交给用户之前使用选定的值对其进行初始化的示例。
  • @KiraSan 简而言之,这是不可能的。这是一个完全不同的问题。看起来你在问一个 XY 问题。您想创建类似 shell 历史记录 的东西吗?那么你不能仅仅通过拦截cin来做到这一点,在这种情况下你提到的readline库似乎更适合实现你想要的。我认为像ncurses 这样的一些库也适合实现这些功能。
  • 顺便说一句,我不喜欢在我的程序中使用 ncurses,因为它会完全控制所有终端的屏幕。
【解决方案2】:

嘿,为什么不将输入写入纯文本文件并将其重定向到 cin ??? 这是最简单的方法。

打开命令提示符。 假设您将用作输入的文本文件是in.txt,而您的程序是prog.exe。 将文本文件和程序保存在同一文件夹中。 cd 到您的文件夹。然后输入:

prog.exe &lt; in.txt

请记住,您的文本文件将按原样处理。如果您知道 cin 只捕捉到下一个空白字符,而字符串输入函数(例如 cin.getline)只捕捉到下一个换行符,这应该不是问题。

//Sample prog.cpp
#include <iostream>

using namespace std;

int main()
{
    int num;
    do
    {
        cin >> num;
        cout << (num + 1) << endl;
    }
    while (num != 0);

    return 0;
}

//Sample in.txt
2
51
77
0

//Sample output
3
52
78
1

对不起,如果你在其他平台,我不知道他们。

【讨论】:

  • 使用linux标签明确指定平台。虽然它与 linux shell 的文件重定向语法相同。
  • 糟糕,我的错。我对这一切都不熟悉。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2012-11-23
相关资源
最近更新 更多