fopen无法读取文件(文件总是等于NULL)

时间:2015-12-27 14:01:17

标签: c arrays initialization fgets

我正在使用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..
            }

4 个答案:

答案 0 :(得分:3)

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

gets()严重受到缓冲区溢出问题的影响,使用fgets()可以避免这种情况。

也就是说,通过说

来解决代码中的 main 问题
char fileName[] ="";

你正在分配一个1-char数组,但这还不足以保存输入。

您应该将其更改为

char fileName[64] = {0};

或类似的东西。

此外,fflush(stdin);违反了C标准,它会调用undefined behavior。删除该声明。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

  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.

答案 3 :(得分:0)

谢谢大家:

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

感谢您的回答。