Как настроить кодировку для Windows - C (СИ)
Формулировка задачи:
Но на этот раз уже не просто вывод в консоль.
Создание и чтение файлов, которые могут быть с равной вероятностью на кириллице, содержать пробелы... Да, что называется, хоть иврит.
На моём уютном линуксовом ноутбуке - всё прекрасно. У знакомых с Шindoшs - всё плохо.
Имя папки получаю с помощью SDL2, а именно - SDL_GetBasePath(). Сомневаюсь, что у самого SDL есть какие-то проблемы с этим... Но проблемы есть у меня.
Допустим, я записал адрес этой папки в буфер, рядом с ним приписал "log.log". Кириллица, насколько я понял, будет в UTF-8. Если сделать fopen сразу указав в качестве пути буфер - будет плохо. Файл не откроется. Как мне гарантированно открывать эти файлы, читать папки внутри этой?
Это настолько глупый вопрос или всем некогда?...
Решение задачи: «Как настроить кодировку для Windows»
textual
Листинг программы
#ifdef WIN32
#warning Windows hamster!
#else
texdir = opendir(texpath);
if(texdir == NULL)
{
logWriteWithPrefix("[ERROR]", "Couldn't open texture directory");
logWrite(texpath);
exit(NOT_FOUND);
}
while(texdirent = readdir(texdir))
{
char *d_name = texdirent->d_name;
if(!strcmp(d_name,"empty.png"))
emptyexists = 1;
if(strcmp(d_name, ".") && strcmp(d_name, "..")) // Skip virtual dirs
{
char* buf = calloc(strlen(texpath) + strlen(d_name) + 1, sizeof(char));
sprintf(buf, "%s%s", texpath, d_name);
DIR *tmpdir;
tmpdir = opendir(buf);
if(tmpdir != NULL)
{
Texturepack tmptexturepack;
tmptexturepack.name = calloc(strlen(d_name), sizeof(char));
sprintf(tmptexturepack.name, "%s", d_name);
AddTexturepackToList(cont->texturepackList, tmptexturepack);
logWriteWithPrefix("Found texturepack", d_name);
if(!strcmp(d_name, "Default")) // If it's name is "Default"
{
deffound = cont->texturepackList->size;
logWrite(" > Default texturepack");
}
if(!strcmp(d_name, cont->texturepackName)) // If it's name is simillar to previous selected
{
selfound = 1;
logWrite(" > Selected texturepack");
}
}
closedir(tmpdir);
free(buf);
buf = NULL;
}
}
closedir(texdir);
#endif
Объяснение кода листинга программы
Выделила для вас основные элементы кода с номерами:
- Объявление переменных: — texdir (указатель на директорию с текстурами); — texdirent (структура, описывающая каталог); — d_name (строка, содержащая имя файла в директории); — emptyexists (флаг, который проверяет наличие пустого файла); — buf (указатель на строку, объединяющую путь и имя файла); — tmpdir (указатель на директорию с текстурами); — cont (указатель на объект, описывающий конфигурацию); — texturepackList (ссылка на список упаковок текстур); — deffound (количество элементов в списке упаковок текстур по умолчанию); — selfound (флаг, который показывает, что выбранный элемент уже присутствует в списке); — texturepackName (строка, содержащая имя выбранной упаковки текстур).
- Описание цикла: — Перебор всех файлов в директории с помощью функции readdir. — Проверка типа файла и добавление его в список упаковок текстур. — Вложенный цикл для проверки, является ли текущий файл виртуальным каталогом.
- Условия, которые проверяются в основном цикле: — Если файл с именем «empty.png» присутствует в директории, то переменной emptyexists присваивается значение 1. — Если текущий файл не является «.» и «..», то выполняются следующие действия: — Создаётся новый указатель на строку, объединяющую путь и имя файла. — Открывается директория, которая соответствует полученному пути. — Создаётся новый объект Texturepack и добавляется в список упаковок текстур. — Выводится сообщение о том, что была найдена упаковка текстур. — Если имя файма совпадает с «Default», то переменная deffound получает значение, равное количеству элементов в списке упаковок текстур по умолчанию. Выводится сообщение о том, что выбранная упаковка текстур — «Default». — Если имя файла совпадает с именем, указанным в конфигурации, то переменная selfound получает значение 1. Выводится сообщение о том, что выбрана упаковка текстур.
- Действия, которые выполняются после завершения цикла: — Закрываются все директории с помощью функции closedir. — Освобождается память, которая была занята указателем на строку buf, с помощью функции free. — Указатель buf обнуляется с помощью оператора NULL.