Как настроить кодировку для 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д