命令行错误

时间:2015-11-29 14:11:27

标签: c linux

以下代码应该逐个字符地读取文本文件并计算它们出现的频率。但是,在Linux命令行上,它会编译,当我尝试通过命令./program<file.txt运行它时,它会显示

useage: huffman <filename>

我不知道错误是什么。

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
int count[26];
int main(int argc, char ** argv)
{
  unsigned char c;
  FILE * file;
int i;

  if ( argc != 2 ) {
    fprintf(stderr, "Useage: huffman <filename>\n");
    exit(1);        // exit with error code
  }

  file = fopen(argv[1], "r");
  assert( file != NULL );
c = fgetc(file);
  while( !feof(file) ) {
   c = fgetc(file);
   count[c-'a']++;
}
for(i=0; i<26; i++)
printf("count[%c]=%d\n",65+i,count[i]);
   fclose(file);
return 0;

2 个答案:

答案 0 :(得分:1)

当你执行

$ ./program < file.txt

您正在使用参数调用该程序,并将其标准输入流设置为从file.txt读取。因此,argc中的main为1,您会收到针对此案例的错误消息。

要解决此问题,您可以

  • 按原样运行程序(没有shell重定向)

    $ ./program file.txt
    
  • 或修改您的程序,使其在没有参数的情况下调用时从标准输入读取。然后可以以任何一种方式调用它。

许多POSIX命令使用约定,如果没有文件名调用,它们会从标准输入读取。例如,

$ cat file.txt

输出file.txt的内容

$ cat

鹦鹉会回复你输入的所有内容。

要实现这一点,你需要这样的东西。

FILE * file = NULL;
if (argc == 1)
  {
    file = stdin;
  }
else if (argc == 2)
  {
    file = fopen(argv[1], "r");
    if (file == NULL)
      {
        fprintf(stderr, "error: %s: %s: %s\n",
                "cannot read file", argv[1], strerror(errno));
        return EXIT_FAILURE;
      }
  }
else
  {
    fprintf(stderr, "error: %s\n", "too many arguments");
    return EXIT_FAILURE;
  }
assert(file != NULL);  /* we have made this sure */

答案 1 :(得分:0)

c必须是int 在索引数组之前,请确保c处于适当的范围内。

   c = fgetc(file);
   if (islower((unsigned char)c)) count[c-'a']++; // assumes 'a' thru 'z' are sequential

您需要#include <ctype.h>获取islower()

的正确原型