2010-01-21 2 views
3

Независимо от того, что я пытаюсь, я не могу получить следующий код для правильной работы.Не могу получить 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 

на первом соиЬ < < (inFile.good()) ;, он печатает 1 и на втором в 0. Что говорит мне, что файл открывается корректно, но входной_файл не удается, как только читайте в нем. Файл имеет более чем достаточно строк/символов, поэтому я не пытался прочесть его до конца файла.

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

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 
+0

Что такое содержимое файла и какие значения levelLW и numLevels в конце этого блока? Я предполагаю, что inFile >> levelLW >> numLevels; жадно потребляет больше байтов, чем вы ожидаете. –

+0

они оба по-прежнему имеют значение 0 после inFile >> – finiteloop

+0

Я предполагаю, что входной файл имеет некоторые невидимые символы. В unix я запустил 'hexdump -b ' для просмотра содержимого файла. –

ответ

2

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

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

+1

Это известная ошибка. См. Мой ответ для ссылки. – JRL

1

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

+0

Я просто перепечатал весь файл с помощью возвратов carrige и линейных каналов в конце, и мне все еще не повезло – finiteloop

+0

его работа через терминал, но не через XCode – finiteloop

+0

Вы #include , затем #include ? Примечание: проще открыть файл: ifstream inFile ("sampleplanet") ;. И более простой способ проверить файл: if (inFile) {inFile >> levelLW >> numLevels; }. – maxpolk

1

Вы сказали, что первый 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).

3

Это известная ошибка. Из Xcode 3.2.1 годов Release Notes:

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

Смежные вопросы