【问题标题】:C File I/O TroubleC 文件 I/O 问题
【发布时间】:2015-02-19 02:02:27
【问题描述】:

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

我遇到的错误:

该方法没有返回正确的数字... 警告... "初始化从指针生成整数而不进行强制转换[默认启用]|"

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

【问题讨论】:

    标签: c file parsing io


    【解决方案1】:
    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. fin() 中的最后一个printf() 缺少格式字符串和参数之间需要的,,实际上您可以只是

      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);
    }
    

    【讨论】:

    • 啊,是的,谢谢。我已经在我的代码中解决了这个问题——但是仍然没有返回正确的值:(
    • @Christopher 你为什么更改问题的代码,现在我的回答没有意义。
    • 我已经更新了代码,以确保没有人会给出相同的答案。我已经指出你在底部的“编辑”注释中纠正了我
    • 我还确保 fopen 没有返回 NULL
    • @Christopher 我检查了你的代码,发现有更多问题,请阅读更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多