zeu*_*sis 5 c++ command-line-arguments
我试图弄清楚如何能够读取 .txt 文件作为命令提示符参数而不是用户输入。如果我有程序
#include <iostream>
#include "cmdline.h"
using namespace std;
int main (int cnt, char * args[]) {
int a = cmdline_int(args, 1);
int b = cmdline_int(args, 2);
cout << "sum = " << a << " + " << b << " = " << a + b << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中文件“cmdline.h”包含
#include <cstdlib>
#include <string>
using namespace std;
int cmdline_int( char* cmdline_a[], int n ) {
return atoi( cmdline_a[ n ] );
}
char cmdline_char( char* cmdline_a[], int n ) {
char c = cmdline_a[ n ][0];
return c;
}
Run Code Online (Sandbox Code Playgroud)
我可以运行程序
./程序 3 5
输出将是
总和 = 3 + 5 = 8
但是,如果我有一个文件(textfile.txt),它只包含列表形式的相同数字,即
3
5
Run Code Online (Sandbox Code Playgroud)
并尝试运行它
./program < 文本文件.txt
我得到
分段故障
如果 textfile.txt 包含“3 5”,它会做同样的事情,尽管无论如何我使用列表形式的文本文件很重要。我需要更改什么才能使 "./program textfile.txt" 具有与 "./program 3 5" 相同的输出?
我猜问题出在 int 主括号之间,我只是不确定具体是什么。
测试程序
当你想检查这些东西时,我建议首先了解应用程序如何接收它们。我将从以下最小程序开始:
int main (int argc, char * argv[]) {
for (int i = 0; i < argc; i++)
cout << argv[i] << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
并执行它
./program 3 5 输出:
./program
3
5
Run Code Online (Sandbox Code Playgroud)./program < textfile.txt 输出:
./program
Run Code Online (Sandbox Code Playgroud)所以现在您可以看到问题在于如何将txt文件传递给应用程序。您的应用程序崩溃的原因是您使用了参数而没有验证它们是否确实存在!
解释
符号 (<) 表示打开文件并将其附加到应用程序的标准输入 (cin)。
./program < textfile.txt与参数无关,而是您必须从cin.
使用参数的解决方案
用
./program `cat textfile.txt`
Run Code Online (Sandbox Code Playgroud)
该cat命令将用文件的内容“替换自身”,它会像您手动编写它一样工作。
使用 < 和 cin 的解决方案
使用./program < textfile.txt以下命令运行时将打印数字:
int a, b;
cin >> a >> b;
cout << a << endl;
cout << b << endl;
Run Code Online (Sandbox Code Playgroud)
组合方案
这对两者都有效:
int main (int argc, char * argv[]) {
int a, b;
if (argc == 1) { // No extra arguments, read from cin
cin >> a >> b;
} else { // Use args
a = cmdline_int(argv, 1);
b = cmdline_int(argv, 2);
}
// Do something with a,b
return 0;
}
Run Code Online (Sandbox Code Playgroud)