У меня возникли проблемы с открытием файла, в имени которого есть символы Юникода. Я создал файл на своем рабочем столе всего с парой строк текста.
c:\users\james\desktop\你好世界.txt
РЕДАКТИРОВАТЬ: я использую CLion. CLion передает параметры в юникоде.
Когда я помещаю эту строку в диалоговое окно запуска Windows, он находит файл и открывает его.
Однако интересно то, что я получаю двойное L'\\'
L'\\'
в имени папки из моего вызова CommandLineToArgvW:L"c:\\\\users\\\\james\\\\desktop\\\\你好世界.txt"
Поэтому я написал небольшую процедуру для копирования имени файла в другой wchar_t *
и удаления косых черт. Все еще не работает.
errno == 2
и f == NULL
.
size_t filename_max_len = wcslen(filename);
//strip double slashes
wchar_t proper_filename[MAX_PATH + 1];
wchar_t previous = L'\0';
size_t proper_filename_location = 0;
for(int x = 0; x < filename_max_len; ++x)
{
if(previous == L'\\' && filename[x] == L'\\')
continue;
previous = filename[x];
proper_filename[proper_filename_location++] = filename[x];
}
proper_filename[proper_filename_location] = L'\0';
//Read in binary mode to prevent the C system from screwing with line endings
FILE *f = _wfopen(proper_filename, L"rb");
int le = errno;
if (f == NULL)
{
perror(strerror(le));
if(le == ERROR_FILE_NOT_FOUND)
{
return DUST_ERR_FILE_NOT_FOUND;
}
else {
return DUST_ERR_COULD_NOT_OPEN_FILE;
}
}
errno
не0
, то посмотрите, что говоритstrerror()
- person Jack   schedule 04.09.2015c:\\\\\\\\\\\\\\\\\\\\\\\\\\bin
такое же, какc:\bin
- person Jack   schedule 04.09.2015+1
вmalloc()
для храненияL'\0'
- person Jack   schedule 04.09.2015wchar_t proper_filename[filename_max_len+1];
- person Roddy   schedule 04.09.2015L'\\'
L'\\'
в имени папки при вызове CommandLineToArgvW Как вы определили, что это действительно двойные символы обратной косой черты? Когда вы просматриваете содержимое строки в окне Autos или Locals в Visual Studio, строковые литералы отображаются с дополнительными символами обратной косой черты. Там нет этих персонажей. Вместо этого просмотрите содержимое в окне Память. - person IInspectable   schedule 06.09.2015CommandLineToArgvW
. Строковые или символьные литералы не задействованы, поэтому возникает вопрос, как определить наличие дополнительных символов обратной косой черты. Почему вы постоянно уходите от ответа на этот, казалось бы, простой вопрос? Причина этого вопроса уже неоднократно упоминалась. - person IInspectable   schedule 07.09.2015if(previous == L'\\' && filename[x] == L'\\')
и ручной проверкой через отладчик CLion где я вижу L'\\' L'\\'. Я не знаю, почему вы думаете, что я недостаточно умен, чтобы понять разницу между L'\\' и L\\\\ или почему вы не можете понять, когда я говорю L'\\', я имею в виду сбежавшее\ . Кажется, никто больше не считает меня глупым. Я имею в виду ... Я знаю мало людей, которые после программирования почти на любом языке более двух дней были бы смущены тем, что такое экранированный символ, но, видимо, я нашел его. - person Bluebaron   schedule 08.09.2015