C 文件 I/O 麻烦

C File I/O Trouble

我正在尝试用 C 编写一个方法,该方法可以查看指定文件中的所有字符,并计算特定字符的出现次数。

所以...

输入:Some_File.c

输出:信件 "J" 出现:在你的文件中 'x' 次。

到目前为止我有什么:

int main()
{
    int jsCount = jsCounter();
    fin(jsCount);
}

//this counts # of "j"s in a file

int jsCounter()
{
    FILE *fp;
    int c;
    int count = 0;
    char myChar =   "j";
    fp = fopen("Doc.c", "r");

    while((c = fgetc(fp)) != EOF) {
        if ( c == myChar)
            count = count + 1;
    }
    return count;
}

//This sends info to User (How many "j"s were found)

fin(int jsCount)
{
    printf("You have a total of");
    printf("%d" jsCount);
}

我遇到的错误:

该方法未返回正确的数字... 警告... "initialization makes integer from pointer without a cast [enabled by default]|"

edit我返回计数值 0,即使文档中有超过 0 个 j 我来自 Java,对 C 还很陌生……有什么帮助吗?

  1. 这是错误的

    char myChar =   "j";
    

    它试图将常量字符串"j"的地址分配给myChar,正确的方法是

    char myChar = 'j';
    

    在c中,字符串字面量由双引号"some string"分隔,字符常量由单引号分隔,如'x',表达式'x'给出字符[=26的ascii码=].

    也有多字符常量,但它们是实现定义的,所以我无法告诉你它们的含义。

    根据你使用的编译器,你可以启用编译器警告,这将防止这种错误,对于gcc你可以使用以下

    gcc -Wall -Wshadow -Wextra -Werror ${source} -o ${program}
    

    注意:检查 fopen() 没有 return NULL,因为如果有,你不应该尝试从文件.

  2. 您没有包含任何需要的头文件

    • stdio.h
  3. main()

    中使用函数之前需要声明它们
    void fin(int jsCount);
    int jsCounter();
    
  4. fin() 需要一个 return 类型,如果它不是 return 任何东西那么 void

    void
    fin(int jsCount)
    {
        printf("You have a total of");
        printf("%d", jsCount);
    }
    
  5. fin()中的最后一个printf()缺少格式字符串和参数之间需要的,,实际上你可以

    printf("You have a total of %d\n", jsCount);
    
  6. Bonus,在c中有一个三元运算符,它是这样工作的

    count += (c == myChar) ? 1 : 0;
    

    相当于

    if (c == myChar)
        count += 1;
    else
        count += 0;
    

    还有一个复合赋值运算符+=

    x += y;
    

    表示

    x = x + y;
    

这是您程序的修复版本

#include <stdio.h>

void fin(int jsCount);
int jsCounter();

int main()
{
    int jsCount = jsCounter();
    fin(jsCount);
}

int jsCounter()
{
    FILE *fp;
    int   c;
    int   count  = 0;
    char  myChar = 'l';

    fp = fopen("Doc.c", "r");
    if (fp == NULL)
    {
        printf("error opening the file\n");
        return 0;
    }
    while ((c = fgetc(fp)) != EOF)
        count += (c == myChar) ? 1 : 0;
    return count;
}

void
fin(int jsCount)
{
    printf("You have a total of %d", jsCount);
}