Как настроить кодировку для Windows - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Но на этот раз уже не просто вывод в консоль. Создание и чтение файлов, которые могут быть с равной вероятностью на кириллице, содержать пробелы... Да, что называется, хоть иврит. На моём уютном линуксовом ноутбуке - всё прекрасно. У знакомых с Шindoшs - всё плохо. Имя папки получаю с помощью SDL2, а именно - SDL_GetBasePath(). Сомневаюсь, что у самого SDL есть какие-то проблемы с этим... Но проблемы есть у меня. Допустим, я записал адрес этой папки в буфер, рядом с ним приписал "log.log". Кириллица, насколько я понял, будет в UTF-8. Если сделать fopen сразу указав в качестве пути буфер - будет плохо. Файл не откроется. Как мне гарантированно открывать эти файлы, читать папки внутри этой?
Это настолько глупый вопрос или всем некогда?...

Решение задачи: «Как настроить кодировку для Windows»

textual
Листинг программы
  1. #ifdef WIN32
  2.     #warning Windows hamster!
  3.  
  4. #else
  5.     texdir = opendir(texpath);
  6.     if(texdir == NULL)
  7.     {
  8.         logWriteWithPrefix("[ERROR]", "Couldn't open texture directory");
  9.         logWrite(texpath);
  10.         exit(NOT_FOUND);
  11.     }
  12.     while(texdirent = readdir(texdir))
  13.     {
  14.         char *d_name = texdirent->d_name;
  15.         if(!strcmp(d_name,"empty.png"))
  16.             emptyexists = 1;
  17.         if(strcmp(d_name, ".") && strcmp(d_name, "..")) // Skip virtual dirs
  18.         {
  19.             char* buf = calloc(strlen(texpath) + strlen(d_name) + 1, sizeof(char));
  20.             sprintf(buf, "%s%s", texpath, d_name);
  21.             DIR *tmpdir;
  22.             tmpdir = opendir(buf);
  23.             if(tmpdir != NULL)
  24.             {
  25.                 Texturepack tmptexturepack;
  26.                 tmptexturepack.name = calloc(strlen(d_name), sizeof(char));
  27.                 sprintf(tmptexturepack.name, "%s", d_name);
  28.                 AddTexturepackToList(cont->texturepackList, tmptexturepack);
  29.                 logWriteWithPrefix("Found texturepack", d_name);
  30.                 if(!strcmp(d_name, "Default")) // If it's name is "Default"
  31.                 {
  32.                     deffound = cont->texturepackList->size;
  33.                     logWrite(" > Default texturepack");
  34.                 }
  35.                 if(!strcmp(d_name, cont->texturepackName)) // If it's name is simillar to previous selected
  36.                 {
  37.                     selfound = 1;
  38.                     logWrite(" > Selected texturepack");
  39.                 }
  40.             }
  41.             closedir(tmpdir);
  42.             free(buf);
  43.             buf = NULL;
  44.         }
  45.     }
  46.     closedir(texdir);
  47. #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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы