使用C ++,需要将文件内容作为参数传递给程序,例如$ ./main <filename.txt
或$ echo the contents of the file | ./main
我希望能够以变量或其他方式访问文件的内容,以便我可以进一步操作。
我有这个基本的列表,包括我一直在尝试的一些东西。数据似乎不在argv
中(我的运行总是告诉我,我有一个参数)。访问以这种方式传递的命令行参数的方法是什么?
#include <fstream>
#include <iostream>
int main(int argc, char **argv)
{
std::cout << "Have " << argc << " arguments:" << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << argv[i] << std::endl;
}
std::istream* input = &std::cin;
if(argc > 1) {
std::cout << input;
std::cout << "more than argument found\n";
}
std::string inputs;
std::cout<< "1:\n";
std::cout<< argv[0];
std::cout<< "\n2:\n";
std::cout<< argv[1];
std::cout<< "\n3:\n";
std::cout<< input;
std::cout<< "\nEnd\n";
return 0;
}
修改
我也许并不完全清楚,因为这是一个相当基本的问题,但我没有意识到。基本上,使用$ ./main <filename.txt
传递是不可协商的。用户RPGillespie的评论指出了我正确的方向。管道将其发送到stdin
(我没有意识到)。因此,我想使用cin
处理数据。最小的工作示例是
int main() {
// read input
for (std::string line; std::getline(std::cin, line);) {
std::cout << line << std::endl;
}
return 0;
}
答案 0 :(得分:4)
cat file | ./main
会将文件内容传输到./main
的输入,而不是参数。
如果要以这种方式管道参数,请使用xargs
:
cat file | xargs ./main
答案 1 :(得分:1)
虽然@liliscent有一个很好的解决方案,但以下也有效(我提到它是为了完整性,因为我觉得它更具可读性):
./main $(cat file)
这将获取名为file
的文件的内容(因为它解释了$(
和)
内的命令),并将它们作为参数传递给./main
。< / p>