2013-07-14 3 views
0

У меня есть текстовый файл, который я пытаюсь преобразовать в объект JSON, используя jsoncpp в моем приложении на C++.Запись строк файла в JSON с использованием C++ и jsoncpp

Содержимое файла в формате так:

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" ... 

я могу записать файл в его entriety на объект 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++ я не знаю, как расколоть линии в двоеточии и использовать первую половину для ключа вместо «теста». Может кто-нибудь предложить способ сделать это?

ответ

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

Затем нужно будет, возможно, лишить ключ и значение из белых символов. Я не буду его освещать, так как есть несколько вопросов и ответов на SO, как это сделать. Например:

  1. Similar function in C++ to Python's strip()?
  2. What's the best way to trim std::string?

EDIT:

Полный пример кода 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"; 
} 

Execute:

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" }] 
} 

Я думаю, что все в порядке.

+0

Спасибо @ luk32, да, нам нужно сохранить программу вниз - регулярное выражение отсутствует. Не знал, с чего начать, сейчас посмотрю. – simonmorley

+0

@simonmorley Я положил его в файл cpp и выполнил. Были небольшие проблемы. Я редактировал все и размещал весь код. Я думаю, что результаты удовлетворительные или, по крайней мере, тривиально, чтобы забрать это отсюда. – luk32

+0

Удивительно! Большое спасибо :) Пытаюсь сейчас .. – simonmorley

 Смежные вопросы

  • Нет связанных вопросов^_^