【问题标题】:How to pass inputs (not arguments) thorugh command line in C/C++?如何通过 C/C++ 中的命令行传递输入(不是参数)?
【发布时间】:2021-08-24 23:55:33
【问题描述】:

假设我有以下简单的 C++ 程序,

#include <bits/stdc++.h>
using namespace std;

int main() { //no argv or argc allowed
    cin >> t;
    while(t--) {
        int n;
        cin >> n;
        // do whatever
    }
}

以及终端中的以下命令:

g++ -std=c++17 -O2 -lm b.cpp && ./a.out

当我运行这个命令时,它会询问我的输入,我必须像下面这样复制并粘贴输入:

7
1 2 
2 4 
2 6
7 5
3 6
4 6
7 2

有没有办法一次性做到这一点?我不介意每次都复制和粘贴,但是我计划制作一个 shell 脚本来为我自动执行此操作。基本上,它获取存储在远程 HTTP 服务器中的输入,然后将其传递给 C++ 程序。需要注意的是,由于某种原因,我不允许写文件,所以我不能做 fstream/freopen。

【问题讨论】:

  • 只需将数据放入文件并重定向到程序即可。 ./a.out &lt; my_data_file
  • 需要注意的是,由于某种原因,我不允许写文件
  • 旁注:freopen 无论如何都不是您大部分时间想要做的事情。我一直在竞争代码中看到它,我从来没有设法弄清楚他们为什么这样做。正常打开一个smurfing文件流就行了。
  • @kaylum 是的 user4581301 是正确的我无法写入文件,因为这不是我的机器,我只能访问 shell 脚本,其余的无法访问,所以可以在其中执行命令shell脚本本身?
  • 我能做的最好的就是在脚本中有./a.out &lt; echo 'input goes here'。不幸的是,我的 bash 太弱了,不知道这是否适用于多行输入。幸运的是,您似乎并不关心它是否是多行的。

标签: c++ linux bash g++


【解决方案1】:

进程替换不是执行此操作的正确方法。使用heredoc:

g++ -std=c++17 -O2 -lm b.cpp && ./a.out << EOF
7
1 2 
2 4 
2 6
7 5
3 6
4 6
7 2
EOF

【讨论】:

    【解决方案2】:

    一种方法是使用bash process substitution 从命令创建“文件”。然后将该文件重定向到程序。

    例子:

    #!/bin/bash
    
    data="
    7
    1 2 
    2 4 
    2 6
    7 5
    3 6
    4 6
    7 2
    "
    
    ./a.out < <(echo ${data})
    

    请注意,data 字符串在这种情况下并不是真正的多行,但对于您显示的程序来说不是必需的。

    【讨论】:

    • echo ${data} 将丢弃换行符。如果要保留换行符,请使用echo "${data}" 用户程序读取输入的方式,换行符并不重要,但建议在这种情况下引用变量。
    猜你喜欢
    • 2011-02-12
    • 1970-01-01
    • 2013-08-10
    • 2017-08-26
    • 2016-07-21
    • 2011-08-21
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多