Нет файлов, созданных с помощью fopen (); почему или где они?

#c #windows #codeblocks #fopen #working-directory

#c #Windows #codeblocks #fopen #рабочий каталог

Вопрос:

Я работаю над проблемой CFD в c, используя CodeBlocks (Windows). Когда я пытаюсь записать результирующие файлы с помощью fopen (), файлы не создаются (если они есть, их нигде нельзя найти). Скрипт создается как проект с несколькими заголовочными файлами, ошибок не возникает, и скрипт, похоже, работает без сбоев.

Я пытался запустить if (f==NULL) , но и там ошибки не возникает. Я также безуспешно пытался запустить CodeBlocks от имени администратора, а также перейти к Project -> Properties -> Build targets и убедился, что рабочий каталог выполнения совпадает с рабочим каталогом. Может быть, я неправильно понял, где находится мой рабочий каталог?

Я попытался выполнить поиск по всему диску C: для имени файла на случай, если он был сохранен в каком-то случайном месте, но поиск дал отрицательный результат.

Используемые препроцессоры — stdio, stdlib и math.

Мне приходится записывать несколько файлов, в основном .txt-файлы, но это пример файла .vtf для графики OpenGL.

 FILE *f = fopen("GLresults.vtf", "w ");
if (f==NULL)
{
    printf("Error");
}
  

Комментарии:

1. Предполагая, что это fopen не возвращает NULL , тогда файл должен быть где-то. Вы пробовали искать это по всему диску?

2. убедитесь, что у вас есть разрешения на создание или изменение любого файла в каталоге.

3. OT: относительно: printf("Error"); 1) сообщения об ошибках должны выводиться на stderr , а не stdout 2) при указании ошибки из библиотеки C функция также должна выводить (на stderr ) текстовую причину, по которой система считает, что произошла ошибка. Функция: perror( "my error message" ); выполняет все вышеуказанное правильно. Примечание: после fopen() ошибки, скорее всего, код не может быть продолжен, поэтому следующая инструкция должна быть: exit( EXIT_FAILURE );

4. Вы пробовали использовать полный путь? Еще одна вещь, которую стоит попробовать, это открыть файл для чтения , о существовании которого вы знаете и к которому, как вы знаете, есть разрешение на доступ.

5. Кроме того, printf("Error") без завершающей новой строки может просто буферизовать строку вместо ее немедленного вывода, и в этом случае вы можете не увидеть сообщение намного позже (или вообще не увидеть, если программа завершается неправильно)

Ответ №1:

Выдает ли ваш код ошибку, если нет, проверьте свой каталог <project directory>binDebug или <project directory>binRelease . Например, если ваш проект с именем CFD находится в C:My Projects и выбрана цель сборки Debug (которая выбрана по умолчанию), проверьте C:My ProjectsCFDbinDebug или C:My ProjectsCFDbinRelease directory.

Ответ №2:

Проблема исправлена! Попробовал несколько предложений выше, но оказалось, что это небольшая и скрытая опечатка в цикле for. Обнаружил ошибку, пытаясь прочитать существующий файл, который не сработал, поэтому я использовал return; и printf("hellon") для локализации проблемы.

Спасибо за помощь, много узнал об отладке, выполняя это.