В попытке переработать мою логику в ответ на этот вопрос.Я решил сериализовать объекты буфера протокола, используя пары message-size
+ protobuf-object-after-SerializeToArray
(не волнуйтесь, если вы не понимаете, о чем я говорю).Во всяком случае, моя реализация не работает.Поэтому я решил посмотреть, как работает c ++ fstream.Это семантический кошмар, я не могу быть уверен, нужно ли мне использовать seekg
для изменения положения ручки после каждого чтения (или, возможно, даже после каждой записи).Я использую только методы write () и get ().Следующая придуманная программа не работает, почему она не работает, и мне нужно искать в этом контексте?
#include <fstream>
#include <boost/cstdint.hpp>
#include <iostream>
void write()
{
boost::uint8_t one = (boost::uint32_t )255;
boost::uint8_t two = (boost::uint32_t) 254;
boost::uint8_t three =(boost::uint32_t) 253;
std::fstream file("test", std::fstream::out | std::fstream::binary | std::fstream::trunc);
file.write( (char *) &one, sizeof(one));
file.write( (char *) &two, sizeof(two));
file.write( (char *) &three, sizeof(two));
std::cout << file.tellg() << std::endl;
file.flush();
file.close();
}
void read()
{
boost::uint8_t one=0;
boost::uint8_t two=0;
boost::uint8_t three=0;
std::fstream file("test", std::fstream::in | std::fstream::binary);
file.get((char *) & one, sizeof(one));
file.get((char *) & two, sizeof(two));
file.get((char *) & three, sizeof(three));
std::cout << file.tellg() << std::endl;
std::cout << (boost::uint32_t) one << ":" << (boost::uint32_t) two << ":" << (boost::uint32_t)three<< std::endl;
file.close();
}
int main()
{
write();
read();
}
Вывод:
3
-1
0:0:0
C ++ бинарный файл io вызывает у меня грусть и глупость: (