我正在创建一个程序,它将文件名(输入或输出)作为命令行参数,从输入文件中读取,计算每个字符并将每个计数的列表打印到输出文件。如果没有给出输入文件,程序应该采用标准输入,如果没有给出输出,程序应该打印到标准输出。
我遇到的两个主要问题是:
1.如果我将多个输入文件列为命令行参数,则只读取最后一个文件作为输入。
2。
如果我将输出文件设为"-oresults.txt"
(argv[j]+2)
,则会将正确的输出打印到文件中,但如果将其作为"-o results.txt" (argv[j+1])
打印则不会。
以下是代码的一部分:
int main(int argc, char *argv[]) {
FILE *in=stdin; FILE *out=stdout; FILE *hold;
int i, j, c, counts[NUM]={0}, total=0;
for (j=1;j<argc;j++) {
if (argv[j][0]=='-') {
if (argv[j][1]=='o') {
if (argv[j][2]=='\0')
out=fopen(argv[j+1],"w");
if (argv[j][2]!='\0')
out=fopen((argv[j]+2),"w"); }
}
else {
in=fopen(argv[j],"r");
}
while ((c = fgetc(in)) != EOF) {
counts[c]++;
total++;
}
答案 0 :(得分:1)
不是自己解析命令行,而是使用getopt()
。查看the optarg man page。它提供了一个有效的例子。
更明确一点,您首先要使用getopt()
循环并完全解析命令行,然后执行计数循环。
答案 1 :(得分:0)
-o results.txt
按空格分隔使它们成为两个不同的参数。如果第二个参数为-o
,则需要更改逻辑并打开文件。目前,您正在比较单个参数中的字符。做类似的事情 -
if (0 == strcmp(argv[1], "-o"))
{
// Open the file
答案 2 :(得分:0)
解析命令行参数的方式存在许多问题:
为每个参数运行while
循环(读取输入),即使它只指定输出文件。如果第一个参数是输出文件,这会导致stdin
被读取为输入。
当输出文件被指定为两个参数,即-o filename
时,您需要在读取-o
参数后跳过下一次迭代的文件名,例如,替换{{1在第一个argv[j + 1]
中使用argv[++j]
。
对fopen
的检查是多余的(虽然无害),请将其替换为argv[j][2] != '\0'
。
else
作为最后一个参数会导致您在-o
的末尾进行索引,这可能只会导致argv
失败,但是:
您没有检查任何fopen
的错误
除此之外,您可以包含完整的代码,现在还不清楚是否有遗漏的错误。