Как настроить кодировку для 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

Объяснение кода листинга программы

Выделила для вас основные элементы кода с номерами:

  1. Объявление переменных: — texdir (указатель на директорию с текстурами); — texdirent (структура, описывающая каталог); — d_name (строка, содержащая имя файла в директории); — emptyexists (флаг, который проверяет наличие пустого файла); — buf (указатель на строку, объединяющую путь и имя файла); — tmpdir (указатель на директорию с текстурами); — cont (указатель на объект, описывающий конфигурацию); — texturepackList (ссылка на список упаковок текстур); — deffound (количество элементов в списке упаковок текстур по умолчанию); — selfound (флаг, который показывает, что выбранный элемент уже присутствует в списке); — texturepackName (строка, содержащая имя выбранной упаковки текстур).
  2. Описание цикла: — Перебор всех файлов в директории с помощью функции readdir. — Проверка типа файла и добавление его в список упаковок текстур. — Вложенный цикл для проверки, является ли текущий файл виртуальным каталогом.
  3. Условия, которые проверяются в основном цикле: — Если файл с именем «empty.png» присутствует в директории, то переменной emptyexists присваивается значение 1. — Если текущий файл не является «.» и «..», то выполняются следующие действия: — Создаётся новый указатель на строку, объединяющую путь и имя файла. — Открывается директория, которая соответствует полученному пути. — Создаётся новый объект Texturepack и добавляется в список упаковок текстур. — Выводится сообщение о том, что была найдена упаковка текстур. — Если имя файма совпадает с «Default», то переменная deffound получает значение, равное количеству элементов в списке упаковок текстур по умолчанию. Выводится сообщение о том, что выбранная упаковка текстур — «Default». — Если имя файла совпадает с именем, указанным в конфигурации, то переменная selfound получает значение 1. Выводится сообщение о том, что выбрана упаковка текстур.
  4. Действия, которые выполняются после завершения цикла: — Закрываются все директории с помощью функции closedir. — Освобождается память, которая была занята указателем на строку buf, с помощью функции free. — Указатель buf обнуляется с помощью оператора NULL.

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы