如何使用C语言计算文本文件中的单词数量?

3
我可以帮助您翻译以下关于编程的内容。这是一篇关于我正在为系统编程课程编写的程序的求助文章。这个程序使用C语言编写,而我对C语言的经验非常有限。我需要将三个格式相同的文本文件合并起来:
word1
word2
word3
...
wordX

我还需要从三个文件中提取每个单词,并将它们放入一个二维数组(字符串数组的数组)中,然后对它们使用某种排序方法。

我不需要在排序方面得到帮助,但我不知道如何获取每个文本文件中的单词计数或将它们放入数组中。


这是我用来计算文件中单词数量的函数。它在 gcc 上无法编译(可能是显而易见的原因,但我不知道)。我的想法正确吗?

int countWords(FILE f){
   int count = 0;
   char ch;
   while ((ch = fgetc(f)) != EOF){
       if (ch == '\n')
           count++;
       //return count; originally here, but shouldn't be.
   }
       return count;
}

编辑:我想我可以找到一种方法来计算程序中的行数,但我不确定这种方法是否与我在这里尝试做的有所不同。(我从来没有真正擅长处理文本文件。)


我成功让程序计算了所有行数。我想我有点生疏了。


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

int countWords(FILE *f){
   int count = 0;
   char ch;
   while ((ch = fgetc(f)) != EOF){
       if (ch == '\n')
           count++;
   }
   return count;
}
int main(void){

   int wordCount = 0;
   FILE *rFile = fopen("american0.txt", "r");
   wordCount += countWords(rFile);
   printf("%d", wordCount);
   return 0;
}

我有点忘记了关于FILE *fileName的指针问题。


1
你能否发布一下你所遇到的编译器错误信息? - Oliver Charlesworth
所以,考虑到每个单词都在不同的行上,你真的想要计算行数:对吗? - Devin Burke
HW3.c:在函数“countWords”中: HW3.c:9:错误:fgetc的参数1类型不兼容 HW3.c:在函数“main”中: HW3.c:19:错误:countWords的参数1类型不兼容 HW3.c:21:3:警告:文件末尾没有换行符 - Michael Schilling
是的,我可以只数行 - Michael Schilling
我删除了每行之间的空格,因为根据您的评论(我也已删除),我得知您不想要它们。 - Devin Burke
4个回答

3
在C语言中,文件类型应使用FILE*。星号很重要,表示该类型是“指向FILE的指针”。countWords(FILE f)不太可能是你想要编写的内容。
每次调用函数时,都会有一个新的count = 0,因此它将始终返回0或1。尝试使用static int count;使count成为全局变量,或将当前计数传递给函数。另一种选择是将return count;行移动到while循环之外。
你还可能需要按照你发布的格式将计数除以二,以得到单词数量。

1
为什么OP需要将计数除以二? - Chris Lutz
糟糕。返回语句应该在while循环之外。该函数只是计算文件中换行符的数量。主函数中有一个不同的计数变量。 - Michael Schilling
@Chris Lutz:当我写下这句话时,OP发布的格式是“word1\n\nword2\n\n...” - Borealid
@Borealid - 我记得,但是它还说了(我查看了修订历史记录):“(没有单词之间的额外行,我是新手)”。 - Chris Lutz

2

应该是 int countWords(FILE *f){,带有 *。并且 return 语句应该仅在最后一个 } 之前,在循环外部。


除此之外,还有什么看起来可能致命的东西吗? - Michael Schilling
那个函数在进行了这些更改后看起来还不错。但是我不确定其他部分,它似乎没有很好地规定清楚。 - Tom Zych

0

这是我大学课本上的一段代码

#include <stdio.h>

int main(void){

  FILE *f = fopen("file.txt", "r");
  int count = 0, word=0;
  char ch;

  while ((ch = fgetc(f)) != EOF){
    if (ch == ' ' || ch == '\n') {
      word = 0;
      } else {
        if(!word){
          count++;
          word = 1;
        }
      }
   }

  printf("%d", count);
  return 0;
}

1
请不要只发布代码答案,除了代码之外还要加上解释。 - Alex Guteniev

0

这里是代码。只需读取空格的数量即可。

#include<stdio.h>
#define FILE_READ "file.txt"

    int main()

{
    FILE * filp;
    int count = 1;
    char c;
    filp = fopen(FILE_READ, "r");
    if(filp == NULL)
        printf("file not found\n");
    while((c = fgetc(filp)) != EOF) {
        if(c == ' ')
            count++;
    }
    printf("worrds = %d\n", count);
    return 0;
}

文本文件

I am megharaj, from india.

输出,

worrds = 5

你有什么想法可以统计一个文本文件中的行数吗? - Vinay Shukla
1
如果(c == ' '),则替换为if(c == '\n')。 - Megharaj
1
@Megharaj 如果文件只包含空格,此程序会将其计算为单词,但这是错误的。 - EsmaeelE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接