не мога да накарам 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)


Това е известен бъг. От Бележки по изданието:

Компилаторът по подразбиране 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