#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char **argv) {
try
{
ifstream file;
string simplePath = "I:/foo.conf";
string markPath = "I:/Folder_à/foo.conf";
file.exceptions(ifstream::failbit | ifstream::badbit | ifstream::eofbit);
file.open(simplePath.c_str()); // ok
file.open(markPath.c_str()); // exception ios_base::failbit set
}
catch (ifstream::failure f)
{
cout << "Exception " << f.what() << endl;
return 1;
}
return 0;
}
Если в имени файла есть знак диакритического знака (например, à), функция open()
выдает исключение ios_base::failbit set
.
Простое исправление
file.exceptions(ifstream::badbit | ifstream::eofbit); // removed failbit from the mask
но это не то, что я хочу: если возможно, я бы хотел установить бит ошибки как обычно.
Я использую Visual Studio 2012 и Windows 8.
wchar_t path[] = L"I:/Folder_à/foo.conf"; std::fstream file(path);
Вы можете использовать это в MSVC. Обратите внимание, что это нестандартный API для MSVC. - person Alok Save   schedule 23.01.2013