【问题标题】:fopen can't read a file(file always equal to NULL)fopen 无法读取文件(文件始终等于 NULL)
【发布时间】:2015-12-27 14:01:16
【问题描述】:

我正在使用 code::blocks 进行编程,但读取文件时遇到问题,这里是代码:

            char fileName[] ="";
            fflush(stdin);
            E11: printf("\n\tEnter the @ Mac (X:X:X:X:X:X) in Hex :");
            gets(MAC);
            E12: printf("\n\tEnter file name:");
            gets(fileName);
            FILE* fichier;
            fichier = fopen(fileName,"r");
            if (fichier == NULL)
            {
                printf("Error! Try Again");
                goto E12;
            }
            else
            {
                printf("sending Data....");
                //TODO..
            }

【问题讨论】:

  • Doing fflush(stdin) 在 C 规范中被明确标记为未定义的行为。一些标准库实现了它,但如果你想要可移植或符合标准,你不应该这样做。
  • 另外,不要使用标签和goto 作为循环,使用实际循环。 C 可能一开始是一种高级汇编语言,但现在已经不是了。
  • 在这种情况下不要使用goto
  • 我忘了提到我在这段代码之前使用了 'scanf()' 和 'getch()'。
  • 我也试过了 'fichier = fopen("file.txt","r");' 但没什么新意。

标签: c arrays initialization fgets


【解决方案1】:

首先,不要使用gets(),而是使用fgets()

gets() 严重存在缓冲区溢出问题,可以通过使用fgets() 来避免。

也就是说,说到代码中的 main 问题,通过说

char fileName[] ="";

您正在分配一个 1 字符的数组,无论如何,这不足以容纳输入。

你应该把它改成

char fileName[64] = {0};

或类似的东西。

另外,fflush(stdin); 违反了C 标准,它调用了undefined behavior。删除该语句。

【讨论】:

  • char fileName[64] = "";0-out 所有fileName 为好。
  • 但是 'fgets()' 从文件中读取,这不是我的情况。
  • @alk 当然,选择问题,先生。 :)
  • @Konnichiwasad 使用 stdin 作为输入文件。 :)
【解决方案2】:

此程序表现出未定义的行为。 filename 是一个只有一个元素的 char 数组。尝试将声明更改为char fileName[256] = "";

【讨论】:

    【解决方案3】:
    1. fflush(stdin) is undefined behavior.
    2. gets 不好。来自man gets

      永远不要使用gets()。因为不知道是不可能说出来的 数据提前多少个字符gets()会读取,因为 gets() 将继续存储超过缓冲区末尾的字符,它 使用起来非常危险。它已被用来破坏计算机 安全。 请改用fgets()

      (添加了强调和代码格式化程序。)

    3. 定义

      char fileName[] = "";
      

      只分配一个字节的内存,因为sizeof("") == 1。您需要一种更灵活的方法,这是fgets 的另一个论点。只需分配一些可能能够存储整个输入的任意数量的字节并将该大小传递给fgets

      char fileName[32];
      
      ...
      
      fgets(fileName, sizeof(fileName), stdin);
      
    4. goto is bad.

    【讨论】:

    • 对,但代码中还有另一个主要问题。 :)
    • @SouravGosh 正在努力。
    【解决方案4】:

    谢谢大家:

    在尝试并尝试后,如果发现问题出在我试图读取的文件是 lorem ipsum 我从:here 复制的。 我不敢相信,这太奇怪了..

    感谢您的回答。

    【讨论】:

      猜你喜欢
      • 2018-01-03
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2014-06-27
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多