【问题标题】:How can I write a number directly to an ofstream object?如何将数字直接写入 ofstream 对象?
【发布时间】:2018-03-18 07:10:53
【问题描述】:

当我打开文件的 ofstream 对象时,我会这样做:

std::ofstream outFile("myfile");

然后我想给它一些数字,但它唯一的方法是::write() 方法,它需要一个const char* 和一个大小。所以我可以这样做:

int temp = 5;
outFile.write((const char*)&temp, sizeof(int));

还有输入operator <<,但我不想要格式化输入,我希望它写成纯二进制数据。我想知道是否有一种方法可以像这样直接写:

outFile.write(12, sizeof(int));
outFile.write(10, sizeof(int));

而不是创建临时对象,或者之前分配一个数组。我认为限制是我可以在参数中输入的唯一值是 RValue,而且似乎没有办法从右值生成左值。我想从技术上讲,右值会一直持续到行尾,所以如果有 std::move 的对立面,它可以工作。可以直接写数字吗?

【问题讨论】:

  • 将未格式化的数据写入std::ostream 的唯一选项是write()put()。而已。选择一个。
  • 我不知道你的最终申请,但是根据给出的信息,我可能会选择忘记ostream 回到简单的旧 C 语言,例如 "(f)read, (f)write, ( f)open" (stackoverflow.com/questions/17598572/…)
  • 只是为了上下文,我正在写一堆缓冲区,所以 ofstream::write() 很好,但我想做的是首先放入一些标题信息,比如大小,所以就像在开头插入一个或两个快速数字。暂时先做这件事似乎很奇怪,但是哦。
  • 从右值生成左值的方法是创建临时值:auto lvalue = whatever_that_gives_you_a_rvalue; ;)
  • 写入(内联)函数,将int 写入ofstream。问题解决了。

标签: c++ file ofstream


【解决方案1】:

所以我可以这样做:

你可以做得更好:

void writeInt( std::ostream &os, int i )
{
    os.write( reinterpret_cast<const char*>(&i), sizeof( i ) );
}

然后将它与右值或左值一起使用:

int i = 0;
writeInt( f, i );
writeInt( f, 5 );
writeInt( f, funtionReturnsInt() );

无论如何您都应该这样做,因为您以后可能想要更改存储/加载数据的格式,这样您只需要更改一次。

【讨论】:

    【解决方案2】:

    我喜欢使用可以编写任何原始类型的模板:

    template<typename T>
    void write_item(std::ostream& os, const T& item) {
        os.write(reinterpret_cast<const char *>(&item), sizeof T);
    }
    

    当然,您可能希望在其中设置一些约束以避免尝试对更复杂的类型进行此操作。

    【讨论】:

      【解决方案3】:

      使用“

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 2019-01-13
        • 2023-03-13
        • 2014-03-22
        • 2023-03-24
        • 1970-01-01
        • 2010-09-24
        相关资源
        最近更新 更多