我试图找出如何能够在.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主括号之间,我只是不确定具体是什么。
答案 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;
}