Нарушение прав доступа Fstream _Fgetc

Я хотел бы прочитать строку из файла с помощью fstream (я использовал это раньше без ошибок), но теперь, если я вызываю getline, я получаю исключение нарушения доступа. Я проследил исключение по коду функции _Fgetc из fstream. Эта строка «если» выдает исключение, но я не знаю, почему.

Я думаю, что указатель файла, вероятно, нулевой, но что я могу с ним сделать? Или моя функция неверна? Я пропустил некоторые настройки в моей Visual Studio 2010?

Я использую:

#include <vector>
#include <istream>
#include <fstream>
#include <string>

Моя функция:

bool ImageOp::parseMap(LPTSTR filename){
if(filename == NULL) return false;

fstream ifs;
ifs.open ( "me_l1.dm" , ios::in );

if(!ifs.is_open())
    return false;

vector<vector<int>> parsedMap;
string line;

while(getline( ifs, line)){
    parsedMap.push_back(splitValues(line));
}

ifs.close();
return true;
}

_Fgetc из fstream, которые вызывают исключение:

template<> inline bool _Fgetc(char& _Byte, _Filet *_File)
{   // get a char element from a C stream
int _Meta;
if ((_Meta = fgetc(_File)) == EOF)
    return (false);
else
    {   // got one, convert to char
    _Byte = (char)_Meta;
    return (true);
    }
}

В fstream есть еще 3 перегруженные функции _Fgetc, некоторые с fread, fgetwc, но как я могу контролировать, какая функция будет использоваться?

РЕДАКТИРОВАТЬ: Извлечь из моего стека:

>ntdll.dll!77178dc9()   
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!77178cd8()    
msvcrt.dll!752eaad6()   
>DialogBasedApp.exe!std::_Fgetc<char>(char & _Byte, _iobuf * _File)  Line 37 + 0x9 bytes    C++
DialogBasedApp.exe!std::basic_filebuf<char,std::char_traits<char> >::uflow()  Line 435 + 0x10 bytes C++
DialogBasedApp.exe!std::basic_filebuf<char,std::char_traits<char> >::underflow()  Line 413 + 0xf bytes  C++
DialogBasedApp.exe!std::basic_streambuf<char,std::char_traits<char> >::sgetc()  Line 153 + 0x50 bytes   C++
DialogBasedApp.exe!std::getline<char,std::char_traits<char>,std::allocator<char> >(std::basic_istream<char,std::char_traits<char> > && _Istr, std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Str, const char _Delim)  Line 412 + 0x23 bytes    C++
DialogBasedApp.exe!std::getline<char,std::char_traits<char>,std::allocator<char> >(std::basic_istream<char,std::char_traits<char> > & _Istr, std::basic_string<char,std::char_traits<char>,std::allocator<char> > & _Str)  Line 483 + 0x2e bytes    C++
DialogBasedApp.exe!ImageOp::parseMap(char * filename)  Line 167 + 0x13 bytes    C++

person AdiC    schedule 22.01.2012    source источник
comment
Сразу видно, что getline() никогда не возвращает false, поэтому ваш цикл никогда не завершится. На самом деле он возвращает ifs.   -  person Joachim Isaksson    schedule 22.01.2012
comment
Удалите using namespace std; и укажите пространства имен. Существует несколько версий getline, поэтому убедитесь, что у вас правильная.   -  person Kerrek SB    schedule 22.01.2012
comment
@JoachimIsaksson: ifs преобразуется в логическое значение, которое является ложным, если поток находится в плохом состоянии (например, когда последняя операция не удалась).   -  person Yakov Galka    schedule 22.01.2012
comment
@ybungalobill Круто! Новость для меня, спасибо :) Видел только оператора! на самом деле так и делает...   -  person Joachim Isaksson    schedule 22.01.2012
comment
Есть ли шанс получить трассировку стека сбоя?   -  person Joachim Isaksson    schedule 22.01.2012
comment
Мое личное предположение об источнике проблемы - splitValues(line), но, не видя, сказать невозможно.   -  person Dietmar Kühl    schedule 23.01.2012
comment
@JoachimIsaksson: я попытаюсь добавить кое-что из стека в свой первый пост, но я не очень хорошо с этим знаком.   -  person AdiC    schedule 23.01.2012
comment
@Dietmar Kühl: после удаления этой строки возникает то же исключение, так что это не так.   -  person AdiC    schedule 23.01.2012
comment
@AdiC: интересно - код выглядит совершенно нормально. Я мог себе представить, что среда C++ не настроена. Например, если вам удалось собрать программу, содержащую код C++, но связанную с компилятором C, или загрузить разделяемую библиотеку C++ в программу C. Другой кандидат — использование библиотеки, не соответствующей заголовкам. Кроме того, вы можете захотеть создать минимальный пример, показывающий эту проблему.   -  person Dietmar Kühl    schedule 23.01.2012
comment
@Dietmar Kühl: Вероятно, в этом причина. В новом проекте все работает. Часть кода на C, поэтому пришлось использовать библиотеки MinGW. Одним из них является libmsvcrt.a, который содержит функцию fgetc. Похоже, что он содержит неправильную реализацию, но если я его не использую, я получу libmingwex.a(wcrtomb.o): error LNK2019: неразрешенный внешний символ __imp____lc_codepage, на который ссылается функция _wcsrtombs error при компиляции.   -  person AdiC    schedule 23.01.2012


Ответы (1)


Проблема решена, причина была в старых библиотеках. После загрузки текущей версии MinGW все работает нормально.

person AdiC    schedule 24.01.2012