Прежде всего, чтобы блок try
приносил какую-либо пользу, необходимо включить исключения для потока.
Во-вторых, цикл типа:
while (! myfile.eof() )
приведетничего, кроме неприятностей, и вы видите это здесь.Проблема (в данном случае) в том, что когда файл не открывается, eof
никогда не будет сигнализироваться - вы не можете / не можете достичь конца файла, потому что - это файла нет,Следовательно, ваш цикл выполняется вечно при поиске экзистенциалистом конца несуществующего файла.Исправьте петлю, и все станет лучше в спешке:
char buffer[256];
ifstream myfile ("test.txt");
while (myfile.getline(buffer,100))
{
cout << buffer << endl;
}
Пока вы это делаете, немного больше исправлений не повредит (если вы действительно не хотели использовать меньшеполовины пространства, выделенного для буфера):
char buffer[256];
ifstream myfile ("test.txt");
while (myfile.getline(buffer,sizeof(buffer)))
{
cout << buffer << endl;
}
Или, конечно, полностью устранить проблему:
std::string buffer;
ifstream myfile("test.txt");
while (getline(myfile, buffer))
cout << buffer << "\n";
Редактировать: обратите внимание, что нет из них (по крайней мере, в настоящее время) зависит от исключений вообще.Все они настроены на запись строки в вывод, если мы преуспели в нашей попытке прочитать строку из ввода.Если файл не открылся, тело цикла просто не будет выполнено, потому что мы не сможем читать из файла, который не открылся.Если мы хотим напечатать сообщение об ошибке, сообщающее пользователю, что файл не открылся, мы должны обработать это отдельно от того, что описано выше.Например:
ifstream myfile("test.txt");
if (!myfile) {
std::cerr << "File failed to open";
return FAIL;
}
while (std::getline(myfile // ...