Во-первых, во-первых, вы не должны так проверять.eof()
не возвращает true
до после неудачного чтения.Но вы можете сделать лучше (и проще)!
проверить состояние потока с помощью неявного преобразования в void*
, которое можно использовать в bool
контексте .Поскольку большинство операций чтения в потоках возвращают ссылку на поток, вы можете написать очень полезный код, подобный следующему:
std::string line;
while(std::getline(currentfile, line)) {
// process line
}
В основном то, что он делает, говорит: «хотя я мог бы успешно извлечь строку изcurrentfile
, сделайте следующее ", это то, что вы действительно хотели сказать; -);
Как я уже говорил, это относится к большинству потоковых операций, поэтому вы можете делать такие вещи:
int x;
std::string y;
if(std::cin >> x >> y) {
// successfully read an integer and a string from cin!
}
РЕДАКТИРОВАТЬ : Я бы переписал ваш код следующим образом:
string line;
unsigned long pos = 0;
int linenumber = 0;
ifstream curfile(input.c_str());
std::cout << "About to try to read the file" << std::endl;
while (std::getline(curfile, line)) {
std::cout << "Getting line " << linenumber << std::endl;
linenumber++;
// do the rest of the work with line
}