即使文件不存在,fopen也会返回非空指针

时间:2018-12-26 07:54:43

标签: c file

我有一个Hex文件,其内容如下:

0x14000800 0x52100000 0xD503201F 0xD503201F 0x0030A308 0x0032D138 0x00000000 0x00000000 0x00000000 0x00000000

我需要打开并阅读此文件。下面是我的代码:

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

int main(void)
{
 char ch, boot_rom_golden[16];
 FILE *myFile = NULL;

 myFile = fopen("/prj/vlsi/tests/boot_rom_fail/src/apps_proc0/sm6140_rom.a52100000_ROM_FULL.hex", "r");

 if (myFile == NULL) {
    printf("Error Reading File\n");
    exit(0);
  }

while ((ch = fgetc(myFile)) != EOF) {
printf("%x \n", ch);
}

我有两个问题:

  1. 我的理解是,如果上述路径中不存在该文件,则fopen应该返回NULL。观察结果是:即使文件不在上述路径(/ prj / vlsi / ....)中,fopen也会返回一些值,然后进入while循环尝试打印内容。为什么会这样呢?我的main.c和hex文件位于同一路径中。但是我仍然尝试给出完整的路径,该路径也给出相同的结果(即,即使文件不存在,它也会返回非零指针值)

  2. 当代码执行while循环时,它将无限期地打印“ FF”。应该是由于上述原因。

请帮助了解该问题以及如何调试此类问题?

2 个答案:

答案 0 :(得分:1)

int使用char代替ch

1)因为fgetc返回了int

  

C库函数int fgetc(FILE * stream)获取下一个字符   (无符号字符)从指定的流,并提高位置   流的指示器。

2)因为EOF可以定义为char无法表示的某个数字

boot_rom_golden

相同

答案 1 :(得分:0)

当我在系统上编译并运行代码时,它的行为与您期望的一样:myFile成为空指针,并且空测试导致早期退出。在您的计算机上,myFile == NULL是不正确的,并且不会发生提前退出。

我推断出您实际执行的代码与您发布的代码不同,或者您的环境中发生的事情与我的有所不同。

您可以逐行跟踪吗?

您确定在执行该命令时您的系统上不存在该文件吗?

也许正在发生截断?尝试使用短路径和短文件名。

尝试使用绝对文件路径,而不是相对路径。

Null可能是一个宏-也许这不是您的想法?尝试使用if(myFile)作为替代。

如果未解决,请发布有关系统的更多信息,并告诉我们myFile是什么,如果您的系统认为它不等于NULL。