Чтение переменных из текстового файла - PullRequest
2 голосов
/ 17 января 2011

У меня есть проблема в c ++, и я надеюсь, что какой-то эксперт здесь может мне помочь.

проблема в том, что существует файл .txt, в котором есть некоторая информация. Я хочу написать программу, которая использует эту информацию.

.txt файл будет выглядеть так:

variable 1: 711   
variable 2: [8 5 6 11]  
variable 3: xyz zyx yyy

программа должна прочитать значения из файла и затем использовать их, есть идеи, как это сделать? !!

/ * ОБНОВЛЕНИЕ * /

Что нужно сделать, это прочитать из текстового файла числовые значения, только числовые значения переменных, а затем использовать эти значения в реальной программе.

например, значение переменной 1 считывается и помещается в переменную x, затем в программе мы можем определить int y = 7 * x;

Я знаю, как читать файл, но я не знаю, как читать конкретные значения переменных.

Обычно программа должна прочитать файл, распознать имя переменной, получить значение и затем использовать его.

большое спасибо

Ответы [ 2 ]

2 голосов
/ 17 января 2011

Похоже, вы хотите иметь некоторый файл, похожий на конфигурацию, чтобы хранить некоторую информацию для использования вашей программой. Существует множество реализаций управления конфигурационными файлами (чтение, извлечение, сохранение, сохранение). Я придерживаюсь малого и удобного libconfig: http://www.hyperrealm.com/libconfig/ Он поддерживает целочисленные, с плавающей точкой и логические переменные, а также массивы, списки и вложенные секции.

1 голос
/ 17 января 2011

Я думаю, в вашем вопросе подразумевается, что переменные могут иметь разные типы, такие как числа, массивы или строки.В этом случае вы должны решить, использовать ли скажем boost::any<> или boost::variant<> или создать свой собственный тип переменной ala:

struct Var
{
    enum { Double, String, Array } Type;
    Type type_;

    double double_;
    std::string string_;
    std::vector<double> array_;

    Var(Type t) : type_(t), double_(0) { } // empty double/string/array
    Var(double d) : type_(Double), double_(d) { }
    Var(const std::string& s) : type_(String), string_(s) { }
    ...
};

В качестве альтернативы вы можете использовать встроенный полиморфизм C ++ и иметь базовый класспроизводный класс для каждого реального типа данных.Возможно, вам даже будет достаточно всегда хранить текстовое представление и хранить все в std::string.Как бы вы это ни делали, допустим, вы храните значения в типе с именем «Тип».

Кажется, имя переменных должно быть указано слева от двоеточия.Если вы знаете, что соответствующие переменные будут жестко запрограммированы в вашей программе, тогда вы можете установить эти ранее существующие переменные в значения справа.В противном случае вам нужно динамически создавать переменные, связанные с этими именами идентификаторов: это можно сделать с помощью ключа std::map<std::string, Type> для идентификатора.Вы можете заполнить его так:

std::map<std::string, Type> variables;

variables["age"] = Type(28);
variables["name"] = Type("Fred");

Для анализа фактического текстового файла вы можете использовать iostreams.Читайте строчку за раз: а

std::string line;
while (getline(cin, line))
{
    std::string::pos n = line.find(':');
    if (pos != std::string::npos)
    {
        std::string identifier = line.substr(0, n - 1);
        Type var;
        {
            // try parsing it as a number...
            std::istringstream iss = line.substr(n + 1);
            char c;
            double d;
            if (iss >> d && !(iss >> c))
                var = d;
        }

        {
            // try parsing it as an array...
            std::istringstream iss = line.substr(n + 1);
            var.clear(Array);
            double d;
            if (iss >> c && c == '[')
                while (iss >> d)
                    result.array_.push_back(d);
                if (iss && iss >> c && c == ']' && !(is >> c))
                    // parsed successfully as an array - use "result"
        }
        {
            // it's a string...
            var = line.substr(n + 1);
        }

Вы должны попытаться начать с этого и попросить конкретной помощи, когда вы застряли.

Примечание: вам может быть легчеполучить работающую (хотя и медленную) программу, отвечающую этому требованию, на таком языке, как Ruby, python или perl.

...