fopen возвращает ненулевой указатель, даже если файл не существует - PullRequest
0 голосов
/ 26 декабря 2018

У меня есть шестнадцатеричный файл, содержимое которого выглядит следующим образом:

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

1004 * для чтения этого файла.Ниже мой код:
#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. Когда код выполняется во время цикла,печатает "FF" бесконечно.Это должно быть по причине, указанной выше.

Помогите, пожалуйста, разобраться в проблеме и как ее устранить?

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Когда я компилирую и запускаю ваш код в моей системе, он ведет себя так, как вы ожидаете: myFile становится нулевым указателем, а нулевой тест вызывает преждевременный выход.На вашей машине myFile == NULL не соответствует действительности, и ранний выход не происходит.

Я делаю вывод, что либо код, который вы фактически выполняете, не совпадает с кодом, который вы опубликовали, или что-то происходитв вашей среде, которая отличается от моей.

Можете ли вы проследить эту строку за строкой?

Вы уверены, что названный файл не существует в вашей системе в тот момент, когда он выполняется?

Возможно, происходит усечение?Попробуйте короткий путь и короткое имя файла.

Попробуйте абсолютный путь к файлу, а не относительный.

Нуль, скорее всего, макрос - возможно, это не то, что вы думаете?Попробуйте if(myFile) в качестве альтернативы.

Если это не решено, опубликуйте дополнительную информацию о вашей системе и сообщите нам, что означает myFile, если ваша система не считает, что она равна NULL.

0 голосов
/ 26 декабря 2018

Используйте int вместо char для ch

1) Поскольку fgetc возвращает int

Функция библиотеки C int fgetc(FILE * stream) получает следующий символ (беззнаковый символ) из указанного потока и перемещает индикатор положения для потока.

2) Поскольку EOF может быть определено как некоторое число, которое не может быть представленоchar

То же самое для boot_rom_golden

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...