0

我有一个文本文件,我试图在我的 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++ 新手,我不知道如何在冒号处拆分行并使用前半部分作为键而不是“测试”。有人可以提出解决方法吗?

4

1 回答 1

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 );

然后可能需要从白色字符中去除键和值。我不会涵盖它,因为关于如何做到这一点的问题和答案很少。例如:

  1. C++ 中与 Python 的 strip() 类似的函数?
  2. 修剪 std::string 的最佳方法是什么?

编辑:

完整的示例代码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 &ltrim(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" }]
}

我认为没关系。

于 2013-07-16T10:17:42.787 回答