当前位置: 首页 > 知识库问答 >
问题:

c++ - 为什么我的protobuf在硬盘上的读写会出问题?

司徒元明
2024-05-15

为什么我的protobuf在硬盘上的读写会出问题.

syntax="proto3";message Pic_log{     string name =1;     int32 time =2;     string  feature_number =3;}

这是message的定义.

int main(){    char feature_number[76]{0};    Pic_log p1,p2,p3;    ofstream output("./pic_lo",ios::out|ios::binary|ios::trunc);    //第一个数据对象定义    p1.set_name("name");    p1.set_time(12345);    p1.set_feature_number(feature_number);    p1.SerializeToOstream(&output);    //第2个数据对象定义    p2.set_name("ne");    p2.set_time(125);    p2.set_feature_number(feature_number);    p2.SerializeToOstream(&output);    output.close();    //开始从文件里读回数据    ifstream input("./pic_lo",ios::in|ios::binary);    if(!input)    {        cout<<"文件打开失败"<<endl;        return 0;    }    while(!input.eof())    {        p3.ParseFromIstream(&input);        cout<<p3.name()<<endl;    }    input.close();    return 0;}

这是我在硬盘上读写它的代码.
输出是一行ne,它只读到了1个,而且是第2个数据.这是为什么呢.

共有1个答案

郑翰海
2024-05-15

protobuf 的 wire format 是没有消息起始和结束的标志的。它里面只有一堆的 key / value 对。

所以读的时候并不知道里面有两个 message 。它只看到了一堆 key / value 对,其中 key 有重复的(因为有两个 message),后出现的就把先出现的覆盖了。于是读出来就是一条 message ,并且值是后写入的那一条的。

可参考:https://protobuf.dev/programming-guides/encoding/

 类似资料:
  • 我试图在Java中将扫描字符串转换为JSONObject,并从JSON Simple导入JSON模块。我已经在构建路径中添加了JSON-simple-1.1.1.jar。然而,当我试图传递内联字符串时。我的内联字符串如下:{“events”:[{“url”:“/操纵多云国家”,“visitorId”:“03c0b5e0-3eeb-382a-8c6d-35e4bb189cf6”,“timestamp

  • 本文向大家介绍Kafka 存储在硬盘上的消息格式是什么?相关面试题,主要包含被问及Kafka 存储在硬盘上的消息格式是什么?时的应答技巧和注意事项,需要的朋友参考一下 消息由一个固定长度的头部和可变长度的字节数组组成。头部包含了一个版本号和 CRC32 校验码。 消息长度: 4 bytes (value: 1+4+n) 版本号: 1 byte CRC 校验码: 4 bytes 具体的消息: n b

  • 我正在构建一个清单Gui应用程序,我希望用描述的第一个字母来搜索项目。所以,我需要在JPanel上显示26个小按钮(将是字母表中的字母)。然后使用搜索按钮来对应保存的文件。但是我似乎不能让按钮显示???它只是JPanel。我这里只有整个程序的片段。只是突出显示其中的JPanel和JButton。

  • 问题内容: 我在使用sql * plus的同时在linux下使用rlwrap实用程序进行命令行编辑。除了实用程序会回显我从键盘输入的每条命令外,其他一切都很好。例如,假设我在提示符下键入了以下语句: 相同的语句将在终端中再次回显,从而使输出看起来像: 然后,当我在下一行中完成select语句时,输出将如下所示: 问题是,对于较大的查询,此冗余将使终端混乱,使查询难以阅读,因此,对抑制不必要的输出的

  • core.js:1671错误类型错误:generatorOrNext不是SafeSubscriber.SchedulerFn[as_next](core.js:3565)在SafeSubscriber.push../node_modules/rxjs/_esm5/internal/subscriber.js.safeSubscriber.__tryRunsub(subscriber.js:195)