关于文件操作的一点文艺

c语言文件题遇到问题,要求输入1/2/3,分别为三个任务,生成三种统计答案。问题在于others计数总是偏少。
然后我发现a用fgetc吸收不了空格,然后就漏了一个(第三行的那一个)。

希望能帮忙解决一下这个问题。可以让dict.dic输出和用例相符

如果dict.dic文件内容如下: (文件每行都有换行符,且前边无空格)

    abcdefghijklmnopqrstuvwxyz
    ABCDEFGHIJKLMNOPQRSTUVWXYZ
    ~!@#$%^&*()_+`1234567890- =\][';/.,<>?":{}|

则三个任务的输出分别如下: (注意:Task1、2、3等也需要输出)

Task1:
capital: 26
lowercase: 26
digit: 10
others: 36

Task2:
line: 3
43 characters in max line.
26 characters in min line.


#include 
#include 
#include 

int main()
{
    FILE *fp=fopen("dict.dic","r");
    char a;
    int dic[130]={0};
    int capital=0,lower=0,digit=0,others=0;
    int max=-1,min=1e6,buf=0,cnt=0,flag=0;
    int n;
    scanf("%d",&n);
    a=fgetc(fp);
    while (a!=EOF)
    {
        cnt++;
        while (a!='\n'&&a!=EOF)
        {

            if (a>='a'&&a<='z')
            {
                dic[a]++;
                lower++;
            }
            else if(a>='A'&&a<='Z')
            {
                dic[a]++;
                capital++;
            }
            else if(a>='0'&&a<='9')
            {
                digit++;
            }
            else{
                if (a==' ')
                printf("woshikongge");
                others++;
            }
            buf++;
            a=fgetc(fp);
            printf("%c",a);
            
        }
        if (buf>max)
        {
            max=buf;
        }
        if (bufif (a=='\n')
            {
                others++;
                a=fgetc(fp);
                buf=0;
            }        
    }
    if (n==1)
    {
            printf("Task1:\ncapital: %d\nlowercase: %d\ndigit: %d\nothers: %d",capital,lower,digit,others+1);

    }
    else if (n==2)
    printf("Task2:\nline: %d\n%d characters in max line.\n%d characters in min line.",cnt,max,min);
    else if (n==3)
    {
        printf("Task3:\nCAPITAL:\n");
    for (char i='a';i<='z';i++)
    {
        printf("%c:%d\n",i,dic[i]);
    }
    printf("LOWERCASE:\n");
    for (char i='A';i<='Y';i++)
    {
        printf("%c:%d\n",i,dic[i]);
    }
    printf("%c:%d",'Z',dic['Z']);
    }
    fclose(fp);
    return 0;
}

参考GPT和自己的思路:根据你的描述,问题出现在others计数总是偏少,主要原因是因为空格字符无法正确计数。你已经发现了问题在于a用fgetc吸收不了空格,然后就漏了一个(第三行的那一个)。解决这个问题的方法是使用fgets函数替代fgetc函数逐行读取文件内容,这样可以正确地处理空格字符。具体的代码改动如下:

a=fgetc(fp);
while (a!=EOF)
{
    cnt++;
    while (a!='\n'&&a!=EOF)
    {

        if (a>='a'&&a<='z')
        {
            dic[a]++;
            lower++;
        }
        else if(a>='A'&&a<='Z')
        {
            dic[a]++;
            capital++;
        }
        else if(a>='0'&&a<='9')
        {
            digit++;
        }
        else{
            if (a==' ')
            printf("woshikongge");
            others++;
        }
        buf++;
        a=fgetc(fp);
        printf("%c",a);
        
    }
    if (buf>max)
    {
        max=buf;
    }
    if (buf<min)
    {
        min=buf;
    }
    if (a=='\n')
        {
            others++;
            a=fgetc(fp);
            buf=0;
        }        
}

修改为

char line[100];
while (fgets(line, sizeof(line), fp) != NULL)
{
    cnt++;
    int len = strlen(line);
    if (line[len-1] == '\n')
    {
        line[len-1] = '\0';
        len--;
    }
    if (len > max)
    {
        max = len;
    }
    if (len < min)
    {
        min = len;
    }
    for (int i = 0; i < len; i++)
    {
        char ch = line[i];
        if (ch>='a'&&ch<='z')
        {
            dic[ch]++;
            lower++;
        }
        else if(ch>='A'&&ch<='Z')
        {
            dic[ch]++;
            capital++;
        }
        else if(ch>='0'&&ch<='9')
        {
            digit++;
        }
        else{
            others++;
        }
    }
}

这样就可以正确计数空格字符了。