从文本文件C ++中读取变量

时间:2015-01-13 17:14:02

标签: c++ fgets

对于我的机器人团队,我的任务是编写一个函数,允许我们将变量值存储在文本文件中,这样我们就可以更新值而无需更新代码。例如:提高车轮速度。我们决定的格式是;空格或#,变量名,空格,变量值。

 variable1 1
#variable3 4
 setspeed 10

我需要做的是因为需要一个变量,我的函数会在第一列搜索所请求的变量并返回它。我建议我使用fgets逐行读取,但我不确定如何使用我们的格式分解行。

2 个答案:

答案 0 :(得分:0)

您可以使用std::stringstream以给定的格式拆分该行。这是一个例子:

    std::string line;               // A line of key/values from text
    std::string key;                // Temporary for our key
    std::string value;              // Temporary for our value
    std::ifstream stream(path);     // Load the file stream
    std::stringstream splitter;     // Prepare a stringstream as a splitter (splits on spaces) for reading key/values from a line

    // Make sure we can read the stream
    if (stream) {
        // As long as there are lines of data, we read the file
        while (std::getline(stream, line)) {
            splitter << line;                                   // Load line into splitter
            splitter >> key;                                    // Read the key back into temporary
            splitter >> value;                                  // Read the value back into temporary
            splitter.clear();                                   // Clear for next line
            variables[key] = value;                             // Store the key/value pair in our variable map.
        }
    }
    else {
        // The file was not found or locked, etc...
        std::cout << "Unable to open file: " << path << std::endl;
    }

请务必加入<string><sstream>。我认为<iostream>也需要getline()

注意:我有一个完整的工作示例,我可以发布,但我想我会把完整的练习留给你。如果您需要更多,请告诉我,但我觉得通过探索解决方案而不是将其交给您来学习是最好的。祝你的机器人好运!

重要提示:我刚刚想到我的解决方案没有处理前缀空格或#&#39;#&#39;你表达。我建议要么更改要求,要么必须使用它作为临时点来处理稍微复杂的解析。例如,您可以检查密钥是否为空,如果是,则变量以空格为前缀。然后,您将重新加载密钥并在其前面添加一个空格以获取最终的变量名称。同样,您可以检查&#39;#&#39;的密钥的第一个字符。它还有一些工作要做,但应该通过修改我的示例代码来实现。

答案 1 :(得分:0)

//----------------------------------------------------------------------------
#include <iostream>
#include <sstream>
#include <fstream>
//----------------------------------------------------------------------------
class Entry
{
public:
    Entry():name("\0"), value(0.0){}
    //Entry (std::string _name, double _value): name(_name), value(_value){}
    ~Entry() {}

    friend std::ostream& operator<<(std::ostream& os, const Entry& entry);
    friend std::istream& operator>> ( std::istream& is, Entry& entry);

    std::string GetName () {return name;} 
    double GetValue () {return value;}

private:
    std::string name;
    double value;
} ;

std::istream& operator>> ( std::istream& is, Entry& entry)
{
   is >> entry.name >> entry.value;
   return is;
}

std::ostream& operator<<(std::ostream& os, const Entry& entry)
{
    os << entry.name << " = " << entry.value << "\n";
    return os;
}

//----------------------------------------------------------------------------
int main()
{   
        std::string filename = "test.txt";
        std::ifstream ifs (filename);

        if (ifs.is_open())
        {
            std::cout << "Variable name:\t";
            std::string name;
            std::getline(std::cin, name);
            Entry entry;
            bool found = false;

            while (ifs >> entry)
                if (entry.GetName() == name)
                {
                    found = true;
                    std::cout << entry;
                    break;
                }

            if (!found)
                std::cout << "The name is wrong\n";

            ifs.close();
        }
        else
            std::cout << "Error opening file "<< filename;

        std::cin.sync();
        std::cin.get();
        return 0;
}
//-----------------------------------------------------------------------------

我相信,用空格开始变量名称并不是一个好主意。如果有必要,我建议“%”和“#”有所作为。