我正在尝试从 .txt 文件中读取文本并使用 c 计算其中的字数

I'm trying to read text from a .txt file and count the amount of words in it using c

提问人:quench 提问时间:10/6/2023 最后编辑:Vlad from Moscowquench 更新时间:10/6/2023 访问量:71

问:

这就是我目前所拥有的。问题在于,“count”变量在命中换行符或空格字符时没有正确地添加到自身中。

#include <stdio.h>
#include <stdlib.h>

int main(void){

    char c;
    int count = 0;
    int* ptr;
    int size;

    FILE *file = fopen("file.txt", "r"); //Reads from input file

    //Test to see if the file exists
    if (file == NULL){
        printf("ERROR 1: TARGET INPUT FILE DOES NOT EXIST, HAS BEEN RENAMED OR HAS BEEN MOVED.");
        exit(1);
    }

    c = fgetc(file);
    while ((c = fgetc(file)) != EOF){

        if(c == " " || c == "\n"){
            count++;
        }

    }

    fclose(file);

    printf("Number of words present in given file: %d", count);  
    return 0;
}

我不太清楚为什么它会失败,尽管我已经查找了多个来源,这些来源几乎具有似乎对他们有用的确切代码。输出应返回一个数字,表示 .txt 文件中的字数。

C 文件 字符 FGETC

评论

2赞 pmg 10/6/2023
0) 您需要将 的类型更改为 。1)打开所有编译器警告:字符()和字符串(或)之间的比较是非法的。cintc" ""\n"
0赞 Jabberwocky 10/6/2023
“......我查找了多个具有几乎完全相同代码的来源......“您能显示其中一两个的链接吗?
0赞 Weather Vane 10/6/2023
您的第一站应该始终是编译器警告:if(c == " " || c == "\n")

答:

2赞 Vlad from Moscow 10/6/2023 #1

对于初学者来说,变量应该声明为具有类型而不是 .cintchar

还有 while 循环之前的调用fgetc

c = fgetc(file);

被忽略

您正在将整数与指针进行比较

if(c == " " || c == "\n"){

因为上述表达式中的字符串文字被转换为指向其第一个字符的指针。编译器应为此 if 语句发出一条消息。

但是如果你愿意写

if(c == ' ' || c == '\n'){

然而,使用字符常量的方法不正确,因为它没有考虑相邻的空间。

评论

1赞 Jabberwocky 10/6/2023
您还应该提到这应该是并且可能指向众多骗子之一。char c;int c;
-2赞 San Zhang 10/6/2023 #2

试试这个

while ((c = fgetc(file)) != EOF){
    if((c>='A'&& c<='Z') || (c>='a'&& c<='z')){
        while ((c = fgetc(file)) != EOF){
            if(c == '\n' || c == ' '){
                count++;
                break;
            }
        }
    }

}

在初始代码中,如果我的文件中有“fsdfs \n asfsf”,则计数可能大于 它应该是。

评论

1赞 Jabberwocky 10/6/2023
这是一个糟糕的答案,因为:1:没有解释。2:没有提到为什么是错的。3:代码过于复杂。char c;
0赞 Surge 10/6/2023
@Jabberwocky,用代替有什么问题?我听说过,但我不明白转换的问题。我知道从返回一个 casted from .这是可能的转换吗 -- 如果这是实际情况的话?如果您保证使用 ASCII,那将不是问题。char cint cfgetsintunsigned charsigned charchar
1赞 Jon Green 10/6/2023 #3
  1. fgetc()返回 一个 ,而不是 .所以应该声明.intcharcint
  2. 您阅读了文件的第一个字符...并丢弃它。你是故意的吗?我可以看到这样做的充分理由,我只是不确定你是否也有同样的想法。
  3. 在 中,您将单个字符与字符串进行比较,因为您使用了双引号和 。你不能在 C 中做到这一点——或者,至少,结果会相当随机。请改用单引号,因此 .这样,您就可以与单个字符值进行比较。if(c == " " || c == "\n")" ""\n"if(c == ' ' || c == '\n')
  4. 您声明了它们,但没有使用它们。不妨删除这些行。一个像样的编译器会警告你未使用的变量。int* ptr;int size;
  5. 无论如何,你的方法都是不正确的。如果您的文件包含大量空行,或者单词之间有多个空格,则字数统计将不正确。您应该计算非空格紧跟空格(或 EOF)的次数,并忽略重复的空格。我会把它留给学生作为练习!