【问题标题】:fgets() crashes my programfgets() 使我的程序崩溃
【发布时间】:2011-12-04 15:33:52
【问题描述】:

我是 C 编程的新手。我正在尝试打开一个文件 (juanjo2.klb),它是我使用相同程序创建的二进制文件,我将在这里展示。问题是我正在尝试使用 fprintf() 函数将字符串打印到文件中,然后使用 fgets() 将字符串写入“cad”字符串,然后使用函数 printf() 打印到屏幕上我从文件中读取的字符串。

当我运行程序时,程序崩溃,Windows (Windows 7) 给我一个消息框,提示我的程序停止工作,它正在寻找问题的解决方案。所以我真的不知道我做错了什么,因为我认为我正确使用了这些功能。我需要你的帮助。以下是源代码:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

#define MAXCHARS 20

int main()
{
    char cad[MAXCHARS];
    FILE *pf;
    char *nombre = "\\juanjo2.klb";
    if(pf = fopen(nombre, "a+b") == NULL)
    {
       printf("Error opening file\n");
       exit(-1);
    }

    fprintf(pf, "%s", "Hola como estas");

    while(feof(pf) == 0)
    {
        fgets(cad, 13, pf);
        printf("%s", cad);//Here I print the string to the screen.
    }

    fclose(pf); //Closing file.

    system("PAUSE");
    return 0;

}

我正在使用 Codeblocks IDE 10.05。感谢您的帮助。

【问题讨论】:

  • 您不能使用 %s 打印二进制数据。一方面,它可能不是空终止的。
  • 在使用cad之前检查fgets的返回值。
  • 您正在打开文件以二进制模式追加,然后您尝试从中读取。
  • 不要以这种方式使用 feof()。它没有达到您的预期。
  • @PaulTomblin: fgets 将在它读取的数据后附加一个空终止符,这不是问题。

标签: c fgets


【解决方案1】:
if((pf = fopen(nombre, "a+b")) == NULL)

这是经典。

【讨论】:

    【解决方案2】:
    ...
    
    int main()
    {
        .
        .
        .
    
        if(pf = fopen(nombre, "a+b") == NULL)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    正如@wildplasser 的回答 (+1) 所指出的,您的第一个问题在上面一行中。


    这应该是:

        if((pf = fopen(nombre, "a+b")) == NULL)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    

    将 FILE * 分配给 pf,然后检查它是否为 NULL


    你原来拥有的方式,即

       if(pf = fopen(nombre, "a+b") == NULL) /* wrong */
    

    您将 pf 设置为 `fopen(nombre, "a+b") == NULL 的结果,如果布尔语句 (==) 为 FALSE,则为 0 或如果它为 !0(通常为 1)是真的。所以 pf 的结果是布尔值,而不是实际的文件指针。当然,这也会导致 if 出现问题,因为它现在正在查看 pf。

      pf = fopen(nomber, "a+b") == NULL; /* here to clarify == happens before = */
    
      if ( pf ) /* i.e. pf != 0 */ 
    

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 1970-01-01
      • 2011-05-26
      相关资源
      最近更新 更多