2017-03-16 5 views
2

verwenden möchte ich eine binäre Datei lesen Cpp verwenden, und seine Art ist mit MsgPack. Ich bin nicht vertraut mit MsgPack und ich versuche, Binärdatei Faust zu lesen und Push MsgPack. Es funktioniert nicht. Es bekommt immer nur die erste Nummer. Kann jemand helfen? Danke vielmals.Lesen Binärdatei MsgPack in C++

#include <bits/stdc++.h> 
#include <msgpack.hpp> 
using namespace std; 

int main() 
{ 
    std::ifstream ifs("input.txt", std::ifstream::in); 
    std::stringstream buffer; 
    buffer << ifs.rdbuf(); 
    msgpack::unpacked upd; 
    msgpack::unpack(upd, buffer.str().data(), buffer.str().size()); 
    std::cout << upd.get() << std::endl; 
    return 0; 
} 

Welche es nur die erste Zahl "3" bekommen kann.

Ich hoffe Zahl zu erhalten:

3 
[3 6 7 5 3 5] 
[6 2 9 1 2 7] 
[0 9 3 6 0 6] 

Und here ist der Eingang Binärdatei.

Antwort

0

msgpack::unpack() entpackt die erste Messageformatierten Daten. Ich denke, dass 3 die Anzahl der folgenden Arrays bedeutet.

In diesem Fall offset ist nützlich. Siehe https://github.com/msgpack/msgpack-c/wiki/v2_0_cpp_unpacker#client-controls-a-buffer

Hier ist der Code zum Lesen der ersten MessagePack-Daten 3 als Zähler. Und dann 3 Mal rufen Sie msgpack::unpack(), um jedes Array zu entpacken. Während dieses Vorgangs wird die Variable offset aktualisiert.

#include <iostream> 
#include <fstream> 
#include <msgpack.hpp> 

int main() 
{ 
    std::ifstream ifs("input.txt"); 
    std::string buffer((std::istreambuf_iterator<char>(ifs)), 
         std::istreambuf_iterator<char>()); 
    msgpack::unpacked upd; 
    std::size_t offset = 0; 
    msgpack::unpack(upd, buffer.data(), buffer.size(), offset); 
    std::size_t count = upd.get().as<std::size_t>(); 
    std::cout << count << std::endl; 
    for (std::size_t i = 0; i != count; ++i) { 
     msgpack::unpack(upd, buffer.data(), buffer.size(), offset); 
     std::cout << upd.get() << std::endl; 
    } 

}

Ich glaube, dass dies der Ansatz auf dem Original-Code basiert.

+0

Ihre Lösung basiert auf Ihrer Annahme, dass die erste Zahl eine Anzahl von folgenden Arrays ist. Was ist, wenn es falsch ist und @Gavin Lee nur 4 Unabhängigkeitsnachrichten analysieren wollte? Zumindest können Sie überprüfen, ob 'offset' immer noch kleiner ist als' buffer.size() 'in Ihrer for-Schleife. – JustRufus

0

ich denke Problem hier: buffer.str().size() Sie

buffer.str().length() 

oder strlen versuchen können, (buffer.str() Daten() c_str()..)

+0

beide std :: string :: Größe und std :: string :: Länge sind 'Synonyme'. http://en.cppreference.com/w/cpp/string/basic_string/size – JustRufus

0

Ihr Code entpackt nur eine msgpack Nachricht (erste, das ist 3), aber tatsächlich die Dateien 4 Nachrichten enthält. Sie können also die Klasse msgpack::unpacker verwenden, um alle Nachrichten nacheinander zu entpacken.

int main() 
{ 
    std::ifstream ifs("input.txt", std::ifstream::in); 
    std::string buffer((std::istreambuf_iterator<char>(ifs)), 
         std::istreambuf_iterator<char>()); 

    msgpack::unpacker pac; 
    pac.reserve_buffer(buffer.size()); 
    std::copy(buffer.begin(), buffer.end(), pac.buffer()); 
    pac.buffer_consumed(buffer.size()); 

    msgpack::object_handle oh; 
    while (pac.next(oh)) { 
     msgpack::object msg = oh.get(); 
     std::cout << msg << std::endl; 
    } 
    return 0; 
} 

P.S. Lesen this und mit #include <bits/stdc++.h> stoppen.