не могу заставить ifstream работать в XCode

Что бы я ни пытался, я не могу заставить следующий код работать правильно.

ifstream inFile;
inFile.open("sampleplanet");
cout << (inFile.good()); //prints a 1
int levelLW = 0;
int numLevels = 0;
inFile >> levelLW >> numLevels;
cout << (inFile.good()); //prints a 0

на первом cout ‹‹ (inFile.good()); он печатает 1, а на втором 0. Это говорит мне, что файл открывается правильно, но inFile дает сбой, как только считывается из него. В файле более чем достаточно строк/символов, поэтому к этому моменту я никак не пытался прочитать конец файла.

Содержимое файла:

8
2
#level 2
XXXXXXXX
X......X
X..X..XX
X.X....X
X..XX..X
XXXX...X
X...T..X
XXX..XXX
#level 1
XXXXXXXX
X......X
X..X.XXX
X.X..X.X
X..XX..X
X......X
X^....SX
XXX.^XXX

person finiteloop    schedule 21.01.2010    source источник
comment
Каково содержимое файла и каковы значения levelLW и numLevels в конце этого блока? Я предполагаю, что inFile ›› levelLW ›› numLevels; жадно потребляет больше байтов, чем вы ожидаете.   -  person Eric Mickelsen    schedule 21.01.2010
comment
они оба по-прежнему имеют значение 0 после inFile ››   -  person finiteloop    schedule 21.01.2010
comment
Я предполагаю, что во входном файле есть невидимые символы. В Unix я запускаю hexdump -b <file> для просмотра содержимого файла.   -  person amit    schedule 21.01.2010


Ответы (4)


Это известная ошибка. Из Xcode 3.2.1 Примечания к выпуску:

Компилятор gcc 4.2 по умолчанию несовместим со стандартным режимом отладки библиотеки C++. Программы C++, скомпилированные с помощью Xcode 3.2, могут не работать в конфигурации отладки. Чтобы исправить это, установите версию компилятора на 4.0 или отредактируйте макросы препроцессора конфигурации отладки и удалите записи:
_GLIBCXX_DEBUG=1 _GLIBCXX_DEBUG_PEDANTIC=1

person JRL    schedule 02.04.2010

Оказалось, что это проблема с X-Code. Я создал проект в net beans, используя точно такой же код, и у меня не было проблем. Странный.

Обновление: в моем проекте X-Code я изменил свой активный SDK с Mac OS 10.6 на Mac OS 10.5, и теперь все работает нормально.

person finiteloop    schedule 22.01.2010
comment
Это известная ошибка. Смотрите мой ответ для ссылки. - person JRL; 03.04.2010

Я воспроизвел и протестировал ваш код и файл, и мой вывод был 11, а уровни levelLW и numLevels были установлены, как и ожидалось. Я бы определенно внимательно посмотрел на скрытые символы в вашем файле (или их отсутствие). Мне нравится использовать Notepad++ с включенным параметром «Показать все символы». Мой файл - это именно то, что вы разместили, с возвратом каретки и переводом строки в конце каждой строки.

person Eric Mickelsen    schedule 21.01.2010
comment
Я только что перепечатал весь файл, используя возврат каретки и перевод строки в конце, и мне все еще не повезло - person finiteloop; 21.01.2010
comment
Вы #включаете ‹iostream›, а затем #включаете ‹fstream›? Обратите внимание, что более простой способ открыть файл: ifstream inFile (sampleplanet);. И более простой способ проверить файл: if (inFile) { inFile ›› levelLW ›› numLevels; }. - person maxpolk; 21.01.2010

Вы сказали, что первый inFile.good() выводит 1. Это должно означать, что файл открылся нормально. Поскольку вы сказали, что «это работает через терминал, но не через XCode» в сообщении tehMick — для чего это стоит — когда я тестировал это, я столкнулся со следующей проблемой: моя среда IDE (C++Builder) запускает программу из каталога DEBUG. (когда вы находитесь в режиме отладки). Мне нужно было поместить «sampleplanet» в каталог DEBUG или использовать открытый путь, который нашел файл, например «..\\sampleplanet».

+MyProjectDirectory
|  mymain.cpp (Even though this is where I had the source file..)
|  sampleplanet
+--DebugDirectory
     mymain.obj
     mymain.exe (the program runs out of this directory.)

Как только я позаботился об этой проблеме, все заработало, как и ожидалось, с использованием приведенного выше кода и файла. Я проверил файл в Notepadd++, чтобы подтвердить [CR][LF] после каждой строки. Однако, если вы создаете файл в Linux, он может иметь только [LF] (я делал все под Windows).

person fupsduck    schedule 21.01.2010