ввод переменных из файла

SFML и C++ Уроки \ Разработка игр Форумы Логика игр ввод переменных из файла

В этой теме 6 ответов, 3 участника, последнее обновление  Serob 6 года/лет, 2 мес. назад.

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)
  • Автор
    Сообщения
  • #4945

    Serob
    Участник
    Сообщений:25

    Зарегистрирован:
    14.05.2017

    Репутация:1

    добрый день!
    появилось немного свободного времени решил поработать над игрушкой. задача следующая есть текстовый “text.txt” в нём содержаться данные пример “speed = 10 time = 5 monstr = 20″. этим файлом устанавливаю количество монстров, их скорость и время атаки. тоесть ети параметры можно задавать из внешнего источника не пересобирая всю игру.
    как можно из файла передать числовые значения соответствующим переменным в программе? всё что я смог это getline() но читается вся строка и чё с ней дальше делать не понимаю. посоветовали использовать следующую схему

    но fscanf не типичная функция и на моём VS 2017 матом ругается и запускаться не хочет (Ошибка C4996).

    #4946

    KindRedSand
    Участник
    Сообщений:82

    Зарегистрирован:
    05.04.2017

    Репутация:30

    Ну на скорую руку могу только предоставить менеджер локализации написаный много времени назад, но новая студия вроде как спокойно “съела” код, для твоих целей он в принципе подойдёт :)
    Но если тебе нужна только загрузка с файла тебе понадобится только этот кусок кода где localeBuffer будет полностью вмещать содержимое файла. И да, не забывай о том что потребуется приведение к типам из строки к числу – для этого есть std::stoi, std::stof, std::stod, std::stol, std::stoul и т.д. Перевод перевод делай желательно sf::String::toWideString() ибо мы работаем с юникодом при использовании строки sfml

     

     

     

    #4947

    Serob
    Участник
    Сообщений:25

    Зарегистрирован:
    14.05.2017

    Репутация:1

    на сколько понимаю в твоем примере ведётся работа со всем буфером. алгоритм решения моей задачи я представляю следующий:
    1. в моей программе есть переменные speed, time и т.д
    2. в файле *.txt есть запись ( speed = 50 time = 10)
    3. при помощи метода я могу считать весь фаил в переменную, массив или ещё что то..
    4. затем нужно взять переменную из программы и сопоставить со считанным из файла, если нашлось совпадение например “speed = 50″ и “speed” тогда значение “50” записать в переменную в программе.
    вот пункт 4 я не понимаю как можно сравнить по сути разное и если в них хоть что то совпадает, то взять часть.
    в моём примере fscanf делал нужное ” %127[a-zA-Z] = %d” маска записанного в фаиле, что сразу заносилось в переменные &name,&value
    плохо что это си функция
    то что с++ мозговыжигатель согласен. тружусь на jave там вроде попроще

    #4948

    KindRedSand
    Участник
    Сообщений:82

    Зарегистрирован:
    05.04.2017

    Репутация:30

    Собственно файл буфферизируется единожды при первом обращении к файлу. Дальше все считывается из строки.
    Здесь запись конечно не сортируется как ключ – значение, но никто не мешает тебе пропустить весь буффер через регулярные выражения (Regex) получив std::map<std::string, std::string>, проходится по нему итерациеq и присваивать значение если ключ совпадает с искомым. Это уже не твои проблемы если юзверь поковырялся и нагадил в конфигах поставив заместо числа строку, так что смело конвертируй где нужно число через функции std::stoi, std::stof.

    #4949

    Serob
    Участник
    Сообщений:25

    Зарегистрирован:
    14.05.2017

    Репутация:1

    С регулярными совсем тяжело, пока в процессе освоения. В общем получилось так.

    осталось добавить сравнение с переменными в файле и программами.

    #4961

    Mihail
    Участник
    Сообщений:4

    Зарегистрирован:
    08.01.2018

    Репутация:2

    А не лучше ли использовать ini файл? Вот готовое решение.

    #4966

    Serob
    Участник
    Сообщений:25

    Зарегистрирован:
    14.05.2017

    Репутация:1

    ini проще, но в целях обучения был выбран именно txt фаил.

Просмотр 7 сообщений - с 1 по 7 (из 7 всего)

Для ответа в этой теме необходимо авторизоваться.