简体   繁体   中英

Command line error

The following code is supposed to read a text file character by character and count the frequency of their occurrence. However, on the Linux command line, it compiles and when I try to run it by the command ./program<file.txt it shows

useage: huffman <filename>

I don't know what's the error.

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

As you execute it as

$ ./program < file.txt

you are calling the program with zero arguments and set its standard input stream to read from file.txt . Therefore, argc in your main is 1 and you get the error message you have placed for this case.

To solve this, you can either

  • run the program as it's supposed to (without shell redirection)

     $ ./program file.txt
  • or modify your program such that it reads from standard input if called with no arguments. It may then be called either way.

Many POSIX commands use the convention that if called with no file names, they read from standard input instead. For example,

$ cat file.txt

outputs the contents of file.txt while

$ cat

parrots back at you everything you type.

To implement this, you'd need something like this.

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 */

c must be an int.
Make sure c is in proper range before indexing the array.

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

You need to #include <ctype.h> for the correct prototype for islower()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM