मुझे डिस्क पर प्रोटोबफ डेटा संग्रहीत करने में कोई समस्या है। एप्लिकेशन मैंने सॉकेट पर डेटा स्थानांतरित करने के लिए प्रोटोकॉल बफर का उपयोग किया है (जो ठीक काम करता है), लेकिन जब मैं डिस्क को डेटा स्टोर करने का प्रयास करता हूं तो यह विफल हो जाता है। असल में, डेटा रिपोर्टों को सहेजने में कोई समस्या नहीं है, लेकिन मैं उन्हें फिर से लोड नहीं कर सकता। किसी भी सुझाव की खुशी से सराहना की जाएगी।प्रोटोकॉल बफर; डेटा को डिस्क में सहेजना और वापस समस्या को लोड करना
void writeToDisk(DataList & dList)
{
// open streams
int fd = open("serializedMessage.pb", O_WRONLY | O_CREAT);
google::protobuf::io::ZeroCopyOutputStream* fileOutput = new google::protobuf::io::FileOutputStream(fd);
google::protobuf::io::CodedOutputStream* codedOutput = new google::protobuf::io::CodedOutputStream(fileOutput);
// save data
codedOutput->WriteLittleEndian32(PROTOBUF_MESSAGE_ID_NUMBER); // store with message id
codedOutput->WriteLittleEndian32(dList.ByteSize()); // the size of the data i will serialize
dList.SerializeToCodedStream(codedOutput); // serialize the data
// close streams
delete codedOutput;
delete fileOutput;
close(fd);
}
मैंने इस फ़ंक्शन के अंदर डेटा सत्यापित किया है, डीएलआईस्ट में डेटा की अपेक्षा है। धाराओं की रिपोर्ट है कि कोई त्रुटि नहीं होती है, और डिस्क पर उचित बाइट्स लिखे गए थे। (फ़ाइल भी उचित आकार का है) लेकिन जब मैं डेटा को वापस पढ़ने की कोशिश करता हूं, तो यह काम नहीं करता है। इसके अलावा, वास्तव में अजीब बात यह है कि अगर मैं इस फ़ाइल में अधिक डेटा जोड़ता हूं, तो मैं पहले संदेश पढ़ सकता हूं (लेकिन अंत में एक नहीं)।
void readDataFromFile()
{
// open streams
int fd = open("serializedMessage.pb", O_RDONLY);
google::protobuf::io::ZeroCopyInputStream* fileinput = new google::protobuf::io::FileInputStream(fd);
google::protobuf::io::CodedInputStream* codedinput = new google::protobuf::io::CodedInputStream(fileinput);
// read back
uint32_t sizeToRead = 0, magicNumber = 0;
string parsedStr = "";
codedinput->ReadLittleEndian32(&magicNumber); // the message id-number i expect
codedinput->ReadLittleEndian32(&sizeToRead); // the reported data size, also what i expect
codedinput->ReadString(&parsedstr, sizeToRead)) // the size() of 'parsedstr' is much less than it should (sizeToRead)
DataList dl = DataList();
if (dl.ParseFromString(parsedstr)) // fails
{
// work with data if all okay
}
// close streams
delete codedinput;
delete fileinput;
close(fd);
}
स्पष्ट रूप से मैंने सब कुछ सरल बनाने के लिए यहां कुछ कोड छोड़े हैं। एक साइड नोट के रूप में मैंने एक स्ट्रिंग & को संदेश को क्रमबद्ध करने का भी प्रयास किया है जो उस स्ट्रिंग को कोडेडऑटपुटस्ट्रीम के माध्यम से सहेजता है। यह या तो काम नहीं करता है। मैंने हालांकि उस स्ट्रिंग की सामग्री को सत्यापित किया है, इसलिए मुझे लगता है कि अपराधी स्ट्रीम फ़ंक्शन होना चाहिए।
यह एक विंडोज वातावरण है, सी ++ प्रोटोकॉल बफर और क्यूटी के साथ।
आपके समय के लिए धन्यवाद!
आप 'नए' का उपयोग क्यों कर रहे हैं और स्पष्ट रूप से विनाशकों को बुला रहे हैं? इस बात का कोई भी मतलब नहीं है। –
मैंने इस समस्या को ठीक करने के लिए संपादित किया है। मुझे नहीं पता कि उस समय ऐसा क्यों अच्छा विचार था। अच्छा पकड़, लेकिन मेरी समस्या को ठीक करने के लिए पर्याप्त नहीं है। – almagest
आप वास्तव में केवल आधा मुद्दा तय करते हैं: पॉइंटर्स और 'नया' का उपयोग करके अभी भी कोई समझ नहीं आता है। लेकिन हाँ, यह आपकी समस्या से संबंधित होने की संभावना नहीं है। –