C 文件 I/O 问题

标签 c file parsing io

我正在尝试用 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);
}

我遇到的错误:

该方法未返回正确的数字... 警告... “初始化从指针生成整数,无需强制转换[默认启用]|”

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

最佳答案

  1. 这是错误的

    char myChar =   "j";
    

    它正在尝试分配常量字符串"j"的地址至myChar ,正确的做法是

    char myChar = 'j';
    

    在c中,字符串文字由双引号"some string"分隔和单引号的字符常量,如 'x' ,表达式'x'给出字符 x 的 ascii 代码.

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

    根据您使用的编译器,您可以启用编译器警告,这将防止出现此类错误,例如 gcc你可以使用以下内容

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

    注意:检查 fopen()没有回来NULL ,因为如果确实如此,您不应该尝试从文件中读取。

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

    • stdio.h
  3. main() 中使用函数之前需要先声明它们。

    void fin(int jsCount);
    int jsCounter();
    
  4. fin()需要一个返回类型,如果它不返回任何内容那么 void

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

    printf("You have a total of %d\n", jsCount);
    
  6. 额外的,在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);
}

关于C 文件 I/O 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28597491/

相关文章:

c - 在 Win32 上使用 GCC 向程序集符号添加前导下划线?

c - 使用 GOTO 时 StackFrames 会受到怎样的影响?

c - 如何在C中找到文件指针的当前行位置?

python - 在python中解析文件

python - 日志文件解析python

c - freeDiameter - 事件时间戳

c++ - 如何在不先启动 IE 的情况下使网络在我的 WinCE 应用程序中工作?

java - 使用java的服务器路径中文件的zip,移动和大小

c - 对包含零件列表的文件进行 fseek 和 fread

java - 使用java解析标记化的c代码