2013-05-22 2 views
2

Мне нужно записать то, что делает мое приложение, в json-файл. Ожидается, что приложение будет продолжаться в течение нескольких недель, и поэтому я хочу поэтапно писать json-файл.jsoncpp писать инкрементировать

На данный момент я пишу json вручную, но есть приложение для чтения журналов, которое использует Jsoncpp lib, и должно быть приятно записать журнал с помощью Jsoncpp lib.

Но в руководстве и в некоторых примерах, которые я не нашел ничего подобного .. Это всегда что-то вроде:

Json::Value root; 
// fill the json 

ofstream mFile; 
mFile.open(filename.c_str(), ios::trunc); 
mFile << json_string; 
mFile.close(); 

Это не то, что я хочу, потому что нет необходимости заполняет память. Я хочу сделать это постепенно. Некоторые советы?

+1

Основная проблема заключается в том, что формат данных JSON определяет закрывающий токен '}'. Итак, если вы хотите, чтобы ваш файл журнала был допустимым блоком JSON после каждой вашей инкрементной записи, вам нужно открыть файл, удалить закрывающий токен, добавить данные и добавить закрывающий токен. Я ничего не нашел об этом в исходном коде jsoncpp. –

+0

да, это то, что я делаю вручную на данный момент .. – nkint

+0

Посмотрите http://stackoverflow.com/questions/6886283/how-i-can-i-lazily-read-multiple-json-objects-from -a-file-stream-in-python – ctn

ответ

3

Если вы можете переключиться на простой JSON в JSON линий, как описано в How I can I lazily read multiple JSON objects from a file/stream in Python? (спасибо CTN за ссылку), вы можете сделать что-то подобное:

const char* myfile = "foo.json"; 

// Write, in append mode, opening and closing the file at each write 
{ 
    Json::FastWriter l_writer; 
    for (int i=0; i<100; i++) 
    { 
     std::ofstream l_ofile(myfile, std::ios_base::out | std::ios_base::app); 

     Json::Value l_val; 
     l_val["somevalue"] = i; 
     l_ofile << l_writer.write(l_val); 

     l_ofile.close(); 
    }  
} 

// Read the JSON lines 
{ 
    std::ifstream l_ifile(myfile); 
    Json::Reader l_reader; 
    Json::Value l_value; 
    std::string l_line; 
    while (std::getline(l_ifile, l_line)) 
     if (l_reader.parse(l_line, l_value)) 
      std::cout << l_value << std::endl; 
}  

В этом случае , у вас больше нет JSON в файле ... но он работает. Надеюсь это поможет.

4

Я сторонник jsoncpp. К сожалению, он не записывается постепенно. Он делает записи в поток без дополнительной памяти, но это вам не поможет.

+0

-1: JsonCpp отлично, но эта реклама никоим образом не отвечает на вопрос. –

+0

@LightnessRacesinOrbit, лучше сейчас? – cdunn2001

+0

Хорошо, но теперь это всего лишь ответ, признающий, что это не ответ: P –