Visual C ++, std и getline (ifstream, string), EOF бросает и разбивает внутри стека std, это нормально? - PullRequest
0 голосов
/ 16 ноября 2011

Я помню все трудности, с которыми он работал, обрабатывая строки и гарантируя, что перевод строки был или не был добавлен до EOF.

Теперь, когда мои ссылки на ошибки взаимодействуют, я задаюсь вопросом, является ли это нормальным поведением до сих пор или просто «расширением» взаимодействия, вот моя ошибка:

A first chance exception of type 'System.Runtime.InteropServices.SEHException' occurred in blah.exe
An unhandled exception of type 'System.Runtime.InteropServices.SEHException' occurred in blah.exe

Additional information: External component has thrown an exception.

Не очень полезно. Если мне нужно завершить с новой строкой, это круто, но оптимизирована ли библиотека std так, что она не может обрабатывать нечетные EOF?

Я думаю, что это должно по крайней мере вызвать исключение, которое раскручивает стек, чтобы найти обработчик или завершить работу, но стек все еще находится глубоко внутри std :: functions. Это просто особенность флагов отладки в VS?

EDIT

    ifstream is("MyfileorSummat.txt");
    string line;
    while (getline(is, line)) { //But when is reads last line @#&#@, it breaks, in the middle of a chain of std calls.

1 Ответ

3 голосов
/ 16 ноября 2011

Я понятия не имею, как соотносится SEHException, но ваш ввод в формате:

std::istream& in;
std::string line;
while (std::getline(in, line)) {
    //stuff
}

Это самый безопасный метод для чтения построчно, который я когда-либо встречал.

I think it should at least throw an exception that unwinds the stack to find a handler or terminate
§ 15.3 (с февраля 2011 г. проект C ++)

Если соответствующий обработчик не найден, вызывается функция std :: terminate (); действительно ли стек разматывается до того, как этот вызов std :: terminate () определяется реализацией (15.5.1).

Это означает, что отладчик был примерно , чтобы вывести из строя всю вашу программу (возможно, не раскручивая), но решил быть хорошим и сломаться и показать вам, что происходит в первую очередь. Вам придется пройтись по стеку, чтобы точно понять, почему Windows решила выбросить SEHException. Согласно некоторому случайному веб-сканированию, SEH может запускаться стандартной библиотекой при доступе к нераспределенной памяти, разыменовании указателей NULL, нехватке памяти или другим ситуациям. Вы также можете попытаться просмотреть элементы объекта SEHException, чтобы увидеть, каков статус и сообщение.

...