【问题标题】:File I/O word count program in CC语言文件I/O字数统计程序
【发布时间】:2023-03-07 07:41:01
【问题描述】:

我知道已经有几个关于这个主题的问题,但似乎这些问题要么没有完全回答,要么很难应用到我的代码中,所以如果这是重复的,我深表歉意。 我在一个也可以进行字数和行数计数(这些工作)的整体 I/O 程序中使用以下函数时遇到问题。 char* 文件名是从命令行中提取的。在这个例子中,它是从一个带有 lorum ipsum 的 txt 文件中提取的。 (69 字)理论上,下面的函数应该从文件名中读取并将其写入数组。然后读取该数组并检查当前字符是否为空格 ' ' 而下一个字符不是。不管怎样,它目前都返回 0。

int wordcount(char* filename) {
int wc=0,i=0,z=0;
char w, test[1000];
FILE *fp;
fp = fopen(filename, "r");
        while (feof(fp) == 0) {
                fscanf(fp, "%c", &test[i]);
                        i++;
        }
        while (z>i-1) {
                if (test[z] = ' ' && test[z+1] != ' ' ) {

                wc++;z++;
        }
        }
return wc;
}

注意:我知道声明一个 1000 个字符的数组非常低效,但我不知道该怎么做。如果您有任何改进或其他方法来完成此操作,如果您分享,将不胜感激。另外,我知道这目前忽略了其他类型的空白,但我只是先测试它,然后再扩展。

感谢您的帮助。

【问题讨论】:

  • 谢谢!我不知道为什么我们会被教导使用 feof 然后幽默地纠正输出,而不是仅仅使用正确的方法。 /叹息
  • '我知道声明一个 1000 个字符的数组是非常低效的,'你应该将 fscanf 读取的字符限制为 999,以防万一,但不要害怕过大的数组。每隔几天,我们就会得到一个 bean-counter,它费力地尝试保存每个字节,因此最终声明数组太小,忘记了 NUL 终止符等。

标签: c file-io word-count


【解决方案1】:

有一个示例函数可以满足您的需要。对您的代码的一些建议,当您不再需要该文件时,fopen() 必须后跟 fclose()。始终检查 fopen 返回的指针是否不为 NULL,在这种情况下什么也不做,只返回错误代码。空格字符后跟非空格字符可以安全地检测到新单词的存在,在这种情况下增加世界计数++wc。使用 getc() 从文件对象中读取一个字符,并使用 isspace() 函数检查该字符是否为空格。如果在 worldcount 运行期间没有人修改该文件,则不需要数组来存储该文件。

int wordcount(const char* filename)
{
    int wc=0;
    char c;
    FILE *fp;

    fp = fopen(filename, "r");
    if(fp == NULL)
    {
        return -1;
    }

    bool previsspace = 1;
    while ((c=getc(fp)) != EOF)
    {
        if (isspace(c)==0 && (previsspace==1))  ++wc;
        previsspace = isspace(c);
    }
    fclose(fp);
    return wc;
};

您将需要以下包含文件:

#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>

【讨论】:

  • 谢谢,效果很好!出于好奇,为什么 ++wc; previsspace = isspace(c); 没有括在括号中?
  • 因为我懒得给 if 条件加括号,所以决定放 ++wc;与 if 在同一行。请注意 previsspace = isspace(c);在 if 条件之外
  • 哦,整洁。抱歉,我不知道允许的语法。
【解决方案2】:

为什么总是得到 0 个单词的结果的具体问题:

while (z>i-1) {

z 永远不会大于 i-1。可能您的意思是在 z 小于 i-1 时循环:

while (z<i-1) {

此外,当您找到一个单词时,您只会增加 z。你应该为你测试的每个字符增加它,不管它是否是一个空格。

【讨论】:

  • 谢谢!我翻转了运算符并将 wc++ 移到了 while 循环之外。然而,虽然我现在收到了函数的输出,但它是一个非常大的数字,比预期的要大得多。添加 'printf("返回数字 %d", wc); ' 在关闭函数之前返回 384.Characters 总数为 451,所以它在一定程度上限制了它,但几乎没有达到它需要的位置。知道会发生什么吗?
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 2011-04-02
  • 2012-11-05
  • 2014-10-28
  • 2017-02-27
相关资源
最近更新 更多