将文本文件而不是用户输入作为命令行参数传递

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 主括号之间,我只是不确定具体是什么。

Dan*_*man 6

测试程序

当你想检查这些东西时,我建议首先了解应用程序如何接收它们。我将从以下最小程序开始:

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)

并执行它

所以现在您可以看到问题在于如何将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)