以下代码应该逐个字符地读取文本文件并计算它们出现的频率。但是,在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;
答案 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()