C程序将文件名作为命令行参数并保留每个字符的计数?

时间:2014-02-19 23:44:10

标签: c input output command-line-arguments

我正在创建一个程序,它将文件名(输入或输出)作为命令行参数,从输入文件中读取,计算每个字符并将每个计数的列表打印到输出文件。如果没有给出输入文件,程序应该采用标准输入,如果没有给出输出,程序应该打印到标准输出。

我遇到的两个主要问题是:

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

3 个答案:

答案 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的错误

除此之外,您可以包含完整的代码,现在还不清楚是否有遗漏的错误。