对于我的机器人团队,我的任务是编写一个函数,允许我们将变量值存储在文本文件中,这样我们就可以更新值而无需更新代码。例如:提高车轮速度。我们决定的格式是;空格或#,变量名,空格,变量值。
variable1 1
#variable3 4
setspeed 10
我需要做的是因为需要一个变量,我的函数会在第一列搜索所请求的变量并返回它。我建议我使用fgets逐行读取,但我不确定如何使用我们的格式分解行。
答案 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;
}
//-----------------------------------------------------------------------------
我相信,用空格开始变量名称并不是一个好主意。如果有必要,我建议“%”和“#”有所作为。