【问题标题】:c: reading from filesc: 从文件中读取
【发布时间】:2012-05-15 09:12:28
【问题描述】:

在这个函数 findBookByTitle 中应该发生的是 fp 被打开,如果一个标题与给定的函数匹配,它将打印标题。假定标题是唯一的,因此一旦找到匹配项,它就可以停止搜索。我的问题是我不完全确定如何将标题与文件中的内容相匹配。这就是我目前所拥有的......

    void findBookByTitle(FILE* fp, char title[])
    {
       FILE * fp = fopen(fp, "r");
       while(!EOF && *fp = title){
          printf("Title: <%c> \n", title);
       }
       if(EOF && *fp != title ){
          printf("No books match the title: <%c> ", title);
       }
    }

当我编译时遇到一些错误,解决这些问题可能毫无意义,因为我的函数仍然不完整,但其中一些确实让我感到困惑。

34: 错误: 'fp' 重新声明为不同类型的符号 32:注意:以前对“fp”的定义在这里 34:警告:从不兼容的指针类型传递“fopen”的参数 1 /usr/include/stdio.h:251:注意:预期为 'const char * restrict' 但参数的类型为 'struct FILE *' 35:错误:二进制 && 的操作数无效(有 'int' 和 'FILE') 38:错误:二进制操作数无效!=(有'FILE'和'char *')

【问题讨论】:

  • 您绝不能取消引用 FILE*。您必须使用正确的 I/O 函数,例如 fgets

标签: c file


【解决方案1】:
  1. 您的函数被声明为将 FILE * 作为其第一个参数,但随后它继续将该参数视为文件名并尝试打开 另一个 FILE * (同名!)使用它。确定参数是FILE * 还是char *,并相应地更改您的代码。

  2. 您正在尝试使用 EOF 来测试 fp 上的 EOF。这不是那么简单。请改用feof(fp)

  3. 您正尝试使用*fp = title(和*fp != title)从fp 读取数据。这根本没有任何意义。您需要使用函数从文件指针中读取,例如fgetsfscanf

【讨论】:

    【解决方案2】:

    当您使用这样的赋值 (*fp = title) 时,您正在用指向 char 的指针覆盖文件指针中的值。之后各种问题都会发生。

    您可能还需要删除该行:

       FILE * fp = fopen(fp, "r");
    

    由于您已经有了FILE *,fp 不是要打开的文件的名称。这是一个已经打开的文件。

    【讨论】:

      【解决方案3】:
      1. 你有两次FILE *pt
      2. 您不能将 FILE 指针与字符串 (char *) 进行比较
      3. 您无法使用选项%c 输出字符串
      4. EOF-1 和运算符 ! 如果 EOF0 这是真的,但 EOF 永远不会改变
      5. 你的算法很奇怪

      正确的代码应该是正确的(到目前为止我已经理解你的问题):

      #include <stdio.h>
      #include <string.h>
      
      void findBookTitle(char *path, char **title, int titles) {
          FILE *fp = fopen(path, "r");
          char line[100];
          int i = 0, count = 0;
          while (fgets(line, 100, fp) != NULL) {
              while (i < titles)
                  if (!strcmp(title[i], line)) {
                      printf("Title: <%s>\n", line);
                      count++;
                  }
              i = 0;
          }
          if (!count)
              printf("No books found.\n");
      }
      

      【讨论】:

        猜你喜欢
        • 2014-04-02
        • 2016-06-18
        • 2016-08-02
        • 2020-11-28
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多