Fopen таинственно не работает под Windows - PullRequest
3 голосов
/ 18 июля 2010

Может быть, у меня просто еще одно отключение, но эта строка доставляет мне много хлопот:

FILE *fp = fopen("data/world.data", "rb");

Это прекрасно работает под Linux при компиляции с GCC. Но когда я компилирую его в Visual Studio, он падает. фп всегда NULL. И БИН, и EXE находятся в одном и том же каталоге. Теперь, чтобы сделать все еще безумнее, когда я запускаю EXE с помощью Wine под Linux ... это ... работает ...

Я абсолютно не имею ни малейшего понятия, что здесь происходит. Может быть, это какая-то безумно глупая ошибка на моей стороне, но я не могу заставить эту штуку работать под Windows: /

Кроме того, у меня есть другая программа, которая прекрасно работает, там файлы данных также содержатся в подкаталоге с именем data.

EDIT
Чтобы прояснить это, ни / NOR `\ * не работают.

РЕДАКТИРОВАТЬ 2:
Хорошо, я отказался от этого, может быть, кому-то интересно попытаться выяснить это, вот ZIP, содержащий EXE, Debug Data for VS и т. Д. https://dl.dropbox.com/u/2332843/Leaf.zip

РЕДАКТИРОВАТЬ 3:
Скомпилировал его с CodeBlocks и MinGW, работает как шарм. Полагаю, это связано с MSVC или настройками проекта в VS.

Ответы [ 7 ]

6 голосов
/ 18 июля 2010

Похоже, что data не является подкаталогом вашей текущей директории при запуске программы. По умолчанию (для целей x86) VS будет собирать и запускать вашу программу из подкаталога DEBUG или RELEASE базового каталога, который вы создали для проекта. Хотя вы можете изменить каталог, который будет «текущим» при его запуске (например, проект | свойства | свойства конфигурации | отладка для VS 2008).

Редактировать: в то время как Windows требует, чтобы вы использовали обратную косую черту в качестве разделителя каталогов в командной строке, прямая наклонная черта работает отлично в коде - это не источник вашего проблема.

2 голосов
/ 24 июня 2012

В окнах вы должны написать следующее:

FILE *fp = fopen("data\\world.data", "rb");

Это похоже на то, что обратный слеш - это специальный символ (поэтому обратный слеш в строке пишется с использованием \, а символ кавычек - \ "и так с другими специальными символами).

1 голос
/ 15 сентября 2012

Поскольку эта проблема возникает только в Windows.Я сомневаюсь, что файл действительно называется "world.data".Как вы знаете, настройка по умолчанию для Windows скрывает расширение файла.Это его настоящее имя world.data.xxx?

0 голосов
/ 06 июня 2016

Я столкнулся с этим сегодня, и это произошло потому, что я использовал "br" вместо "rb" в этом аргументе режима.

Базовый fopen создает какое-то исключение, которое регистрируется только как сбой. Нет смысла возвращать стандартный ответ NULL или устанавливать соответствующие значения ошибок.

0 голосов
/ 15 сентября 2012

У меня случилась такая же проблема, и вдруг я понял это.

Это должно быть ваша вина Windows.

Допустим, FILE *fp = fopen("data/world.data", "rb"); в Windows, если вы скрываете расширения, то вы можете увидеть файл data / world.data, но на самом деле это может быть /data/world.dat.txt или несколько.

Поэтому, пожалуйста, проверьте расширения.

Надеюсь, это поможет!

0 голосов
/ 18 июля 2010

Включите строку в GetCurrentDirectory (), чтобы увидеть, запускаете ли вы из ожидаемого каталога.

Когда я разрабатываю на C # / C ++ в Visual Studio, я обычно запускаю его из папки отладки.,Я не думаю, что имеет значение, если в .net используется косая черта вместо обратной косой черты.

0 голосов
/ 18 июля 2010

Я не уверен, но это может быть потому, что вы используете косую черту вместо (экранированной) обратной косой черты в пути?

...