2012-01-22 36 views
0

私はfstreamでファイルから行を読みたいと思っていますが、前にgetlineを呼び出すとアクセス違反例外が発生します。私はfstreamから_Fgetcを機能させるためにコードを介して例外をトレースしました。その "if"行が例外をスローしますが、私はなぜそれがわかりません。Fstream _Fgetcアクセス違反

私はファイルポインタがおそらくnullだと思いますが、どうすればいいですか?または、私の機能が間違っていますか?私のVisual Studio 2010に何か設定がありますか?

私が使用している:

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

My機能:fstreamのから

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原因例外:

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); 
    } 
} 

別の3つのオーバーロード関数_Fgetcはfstreamのであり、いくつかのfread、fgetwcがありますが、どの機能を使用するかをどのように制御できますか?

EDIT:私のスタックから抽出します。解決

>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++ 
+0

すぐに表示されるのは、getline()がfalseを返さないということです。ループは決して終了しません。実際にifsを返します。 –

+0

'using namespace std;'を削除し、名前空間のスペルを指定してください。 'getline'のいくつかのバージョンがありますので、正しいものを持ってください。 –

+0

@JoachimIsaksson: 'ifs'はboolに変換されます。ストリームが悪い状態にある場合(たとえば最後の操作が失敗したときなど)はfalseです。 – ybungalobill

答えて

2

問題、それは古いライブラリによって引き起こされました。 MinGWの現在のバージョンをダウンロードした後、正常に動作します。

関連する問題