C中的文件I / O字数计数程序

时间:2018-02-05 00:26:02

标签: c file-io word-count

我知道有几个人已就这个话题提出过要求,但似乎这些问题要么没有完全回答,要么难以应用于我的代码,所以如果这是重复,我会道歉。 我在整个I / O程序中遇到以下功能时出现问题,该程序也执行字和行计数(这些工作)。 char * filename从命令行中提取。在这个例子中,它是从带有lorum ipsum的txt文件中提取的。 (69字)理论上,下面的函数应该从filename读取并将其写入数组。然后读取该数组并检查当前字符是否为空格' '而下一个角色不是。它无论如何都会返回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字符数组是非常低效的,但我不确定如何做到这一点。如果您有任何改进或其他方法来实现这一点,如果您分享,将不胜感激。此外,我知道这当前忽略了其他类型的空白,但我只是先测试它,然后再扩展。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

while (z>i-1) {

z永远不会超过i-1。可能你想在z小于i-1时循环:

while (z<i-1) {

此外,只有在找到单词时才会增加z。你应该为你测试的每个角色增加它,无论它是否是空格。

答案 1 :(得分:0)

有一个示例功能可以满足您的需求。对于代码的一些建议,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>