次のコード(名前空間stdを使用)を使用して、ファイルの内容を文字列に変換しています。
コード1
string fileToString(const string& filename)
{
ifstream file(filename, ios::binary);
if (!file) return "";
string str(istreambuf_iterator<char>(file),
(istreambuf_iterator<char>()));
return str;
}
上記のコードが機能するのは奇妙だと思いますが(string :: size()をWindowsエクスプローラーで見つかった実際のファイルサイズと一致させました)、次のコードは機能しません。
コード2
string fileToString(const string& filename)
{
ifstream file(filename, ios::binary);
if (!file) return "";
string str(istreambuf_iterator<char>(file),
istreambuf_iterator<char>());
return str;
}
2番目のパラメーターの前後に括弧がないことに注意してください。2番目の関数は、次のコンパイラエラーを出します。
1エラーC2664:'std :: basic_string <_Elem、_Traits、_Ax> :: basic_string(const std :: basic_string <_Elem、_Traits、Ax>&)':パラメータ1を'std :: string( _cdecl *)から変換できません(std :: istreambuf_iterator <_Elem、_Traits>、std :: istreambuf_iterator <_Elem、Traits>( _cdecl *)(void))'から'const std :: basic_string <_Elem、_Traits、_Ax>& '
2 IntelliSense:「std :: string(std :: istreambuf_iterator> file、std :: istreambuf_iterator>(*)())」から「std :: basic_string、std::allocator>」に変換するための適切なコンストラクターが存在しません
WindowsXPSP3でVisualStudio2010、Win32コンソールアプリケーションを使用しています。
驚いたことに、次のコードは期待どおりにコンパイルおよび動作します。
コード3
string fileToString(const string& filename)
{
ifstream file(filename, ios::binary);
if (!file) return "";
return string(istreambuf_iterator<char>(file),
istreambuf_iterator<char>());
}
コード2でコンパイラエラーが発生するのはなぜですか?