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++
すぐに表示されるのは、getline()がfalseを返さないということです。ループは決して終了しません。実際にifsを返します。 –
'using namespace std;'を削除し、名前空間のスペルを指定してください。 'getline'のいくつかのバージョンがありますので、正しいものを持ってください。 –
@JoachimIsaksson: 'ifs'はboolに変換されます。ストリームが悪い状態にある場合(たとえば最後の操作が失敗したときなど)はfalseです。 – ybungalobill