Lex 字数计数器 运行 不正确。打开文件可能有问题

Lex word counter not running properly. Possible issue with opening file

我正在开发 Lex 程序以从文件中提取一串文本并计算文本文件中的单词、字符和行数。我现在有以下代码。

%{
#include <stdio.h>
#include <stdlib.h>
int wordCount=0, charCount=0, lineCount=0;
%}

characters=[a-zA-z0-9]
word {characters}+
line \n

%%
{line} {charCount++; lineCount++;}
{word} {wordCount++; charCount+=strlen(yytext);}
. {charCount++;}
%%
int main(int arg, char *argv[]){
    
    extern FILE *yyin;
    yyin=fopen(argv[0],"r");
    yylex();
    printf("characters: %d\nwords: %d\nlines: %d\n",charCount,wordCount,lineCount);
    yyin=fclose(argv[0]);
    return 0;
}

我正在使用的文本文件是这样的

Hello world
Testing Testing 123
What!
I can't hear you

代码编译并运行,但在运行时打印出此结果。

characters: 28072
words: 2
lines: 23

即使是空文件也会出现这种情况。

我相信我的想法是正确的,但文件似乎没有被正确读取,我不确定哪里出了问题。我的印象是这就是您在 Lex 中打开文件的方式,但我不确定这是我出错的地方还是其他地方的问题。如果答案非常明显,我深表歉意,但我对 C 感到生疏,以至于在我打字时薄片脱落,而 Lex 对我来说是未知领域。

非常感谢您的帮助!

您应该打开 argv[1]argv[0] 将打开您的可执行文件。

你也应该打电话给fclose(yyin)fclose 需要文件指针,而不是文件名。我有点惊讶你的程序编译。

添加更多的错误检查和一些额外的调试信息可能会帮助您找出问题所在。我的意思是这样的:

int main(int argc, char *argv[]){

    extern FILE *yyin;
    if (argc != 2)
    {
      fprintf(stderr, "usage: %s <input_file>\n", argv[0]);
      exit(EXIT_FAILURE);
    }
    printf("Opening file %s\n", argv[1]);
    yyin=fopen(argv[1],"r");
    if (!yyin)
    {
      fprintf(stderr, "Failed to open %s\n", argv[1]);
      exit(EXIT_FAILURE);
    }
    yylex();
    printf("characters: %d\nwords: %d\nlines: %d\n",charCount,wordCount,lineCount);
    fclose(yyin);
    return 0;
}

这会检查是否已在命令行上指定输入文件,如果没有则打印用法消息。 它还打印它试图打开的文件的名称并检查文件是否已成功打开。