fstream не открывает файлы с диакритическими знаками в имени пути

#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.


person eang    schedule 23.01.2013    source источник
comment
Вы уверены, что можете использовать те, у которых узкие струны?   -  person chris    schedule 23.01.2013
comment
какая кодировка исходного файла? вполне возможно, что она не соответствует кодировке Windows, используемой для файловой системы.   -  person SirDarius    schedule 23.01.2013
comment
@chris разрешен в posix/linux. UTF-8   -  person nishantjr    schedule 23.01.2013
comment
@njr, Да, но это Windows 8 :p   -  person chris    schedule 23.01.2013
comment
wchar_t path[] = L"I:/Folder_à/foo.conf"; std::fstream file(path); Вы можете использовать это в MSVC. Обратите внимание, что это нестандартный API для MSVC.   -  person Alok Save    schedule 23.01.2013
comment
@chris Не знаю, но в Linux этот код компилируется нормально.   -  person eang    schedule 23.01.2013
comment
@SirDarius Кодировка исходного файла - UTF-8 - 65001.   -  person eang    schedule 23.01.2013
comment
@AlokSave Я не могу использовать wchars, это будет кроссплатформенный код.   -  person eang    schedule 23.01.2013
comment
Тогда это объясняет это, потому что, согласно этому ответу: stackoverflow.com/a/2051018/393701 имена файлов Windows (в NTFS) хранится как UTF-16, поэтому необходимо использовать wchar_t, потому что ANSI-версии функций Windows не понимают UTF-8.   -  person SirDarius    schedule 23.01.2013
comment
Так что я вынужден с wchars? Базовая операция (например, открытие файла) действительно нуждается в платформенно-зависимом коде?   -  person eang    schedule 23.01.2013
comment
Это действительно было бы отстойно, потому что это имя пути просто содержит high-asci, и я не вижу в этом ничего плохого. Если это вообще что-то значит (и я не понимаю, как это могло быть), это работает на моей OS X (10.8), поэтому, как только вы получите, это отстой, чтобы быть Windows, это идет туда, куда кажется. Навскидку, какое отношение имеет кодировка файла к его открытию? Файловая система должна иметь значение в этом отношении; не то, что в самом файле (или я пропустил что-то очевидное (часто случается))?   -  person WhozCraig    schedule 23.01.2013