我有一个文本文件,我正在尝试使用我的c ++应用程序中的jsoncpp转换为JSON对象。
文件内容的格式如下:
system type : Atheros AR7241 rev 1
machine : Ubiquiti UniFi
processor : 0
cpu model : MIPS 24Kc V7.4
BogoMIPS : 259.27
这开始很方便。我需要键来匹配第一列和第二列的值,如下所示:
{ "meh" : [{ "system type" : "Atheros AR7241 rev 1", "machine" : "Ubiquiti UniFi" ...
我可以将文件写入json对象。但那就是我能得到的......
Json::Value root;
string line;
ifstream myfile( "/proc/cpuinfo" );
if (myfile)
{
while (getline( myfile, line ))
{
root["test"] = line;
cout << root;
}
myfile.close();
}
哪个很接近,但显然给了我这样的json:
{
"test" : "system type : Atheros AR7241 rev 1"
}
我是c ++的新手我不知道如何在冒号分割线并使用前半部分代替“测试”。有人可以建议一种方法去做此?
答案 0 :(得分:1)
我建议使用"string::find()"和"string::substr()"的组合。
或者一些正则表达式的东西,但我认为需要重新审视标准库。
示例:
std::string::size_type n;
std::string key;
std::string value;
n = line.find(':');
key = line.substr( 0, n );
value = line.substr( n+1 );
然后可能需要从白色字符中剥离键和值。我不会介绍它,因为关于如何做的问题和答案很少。 E.g:
编辑:
完整示例代码split.cpp
:
/// TRIMMING STUFF
// taken from https://stackoverflow.com/a/217605/1133179
#include <algorithm>
#include <functional>
#include <cctype>
#include <locale>
// trim from start
static inline std::string <rim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun<int, int>(std::isspace))));
return s;
}
// trim from end
static inline std::string &rtrim(std::string &s) {
s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun<int, int>(std::isspace))).base(), s.end());
return s;
}
// trim from both ends
static inline std::string &trim(std::string &s) { return ltrim(rtrim(s)); }
/// ~~~ TRIMMING STUFF ~~~
#include <string>
#include <iostream>
int main(){
std::string::size_type n;
std::string key;
std::string value;
std::string line = "system type : Atheros AR7241 rev 1";
n = line.find(':');
key = line.substr( 0, n );
value = line.substr( n+1 );
std::cout << "line: `" << line << "`.\n";
std::cout << "key: `" << key << "`.\n";
std::cout << "value: `" << value << "`.\n";
/// With trimming
std::cout << "{\n "json" : [{ \"" << trim(key) << "\" : \"" << trim(value) << "\" }]\n}\n";
}
执行:
luk32:~/projects/tests$ g++ ./split.cpp
luk32:~/projects/tests$ ./a.out
line: `system type : Atheros AR7241 rev 1`.
key: `system type `.
value: ` Atheros AR7241 rev 1`.
{
"json" : [{ "system type" : "Atheros AR7241 rev 1" }]
}
我认为没关系。