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

时间:2017-10-24 07:01:16

标签: 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;   
}

文件&#34; cmdline.h&#34;包含

#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;
}

我可以将程序作为

运行
  

./ program 3 5

,输出将是

  

sum = 3 + 5 = 8

但是,如果我有一个文件(textfile.txt),它只包含列表形式的相同数字,即

3
5

并尝试将其作为

运行
  

./ program&lt; TextFile.txt的

我得到了

  

分段错误

如果textfile.txt包含&#34; 3 5&#34;它会做同样的事情,尽管重要的是我仍然使用列表形式的文本文件。我需要做些什么来改变#34; ./ program textfile.txt&#34;具有与&#34; ./ program 3 5&#34;相同的输出。 ?
我猜测问题出在int主括号之间,我只是不确定具体是什么。

4 个答案:

答案 0 :(得分:2)

测试计划

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

int main (int argc, char * argv[]) {
  for (int i = 0; i < argc; i++)
    cout << argv[i] << endl;
  return 0;   
}

执行它

  • ./program 3 5输出:

    ./program
    3
    5
    
  • ./program < textfile.txt输出:

    ./program
    

现在您可以看到问题在于txt文件如何传递给应用程序。你的应用程序崩溃的原因是你使用参数而不验证它们实际存在!

<强>解释

符号(&lt;)表示打开文件并将其附加到应用程序的标准输入(cin)。

./program < textfile.txt与参数无关,而是必须从cin读取。

使用参数的解决方案

使用

./program `cat textfile.txt`

cat命令将“替换”自身与文件的内容,它将像您手动编写一样工作。

解决方案使用&lt;和cin

使用./program < textfile.txt运行时,以下内容将打印数字:

int a, b;
cin >> a >> b;
cout << a << endl;
cout << b << endl;

合并解决方案

这适用于两者:

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;
}

答案 1 :(得分:1)

将您的程序运行为:

./program myfile.txt

并使用argv[1]命令行参数来接受文件名。解析相应:

#include <iostream>
#include <fstream>
#include <string>

int main(int argc, char* argv[]) {
    if (argc > 1) {
        std::ifstream fs(argv[1]);
        int a, b;
        while (fs >> a >> b) {
            std::cout << a << ' ' << b << '\n';
        }
    } else {
        std::cout << "No arguments." << '\n';
    }
}

答案 2 :(得分:0)

您将textfile.txt重定向到您的程序中,因此您无法直接从参数中读取它。

您可以使用cin

从重定向中读取文件内容
char c;
while (std::cin.get(c))
{
    // process char
}

或者,您可以将文件名作为参数传递给 ./ program textfile.txt ,并从文件中读取

char* filename = args[1];
std::ifstream infile(filename);
int a = 0, b = 0;
infile >> a >> b;

答案 3 :(得分:0)

#include <stdio.h>
int main(int argc, char* argv[]) {
  *//read from textfile one char at a time:*
  char c;
  while ((c=getchar()) != EOF){ 
     *//Command line should look like:
     //./program < textfile.txt*
    printf("%c",c); //print char 
  }
  return 0;
}