【问题标题】:std streams to write to void* and backstd 流写入 void* 并返回
【发布时间】:2012-08-08 19:52:21
【问题描述】:

如何让 fstream 写入 void 指针?

基本上我已经使用了 MapFileView 并从中获得了一个用于共享内存的 void 指针。

我使用 copymemory 在两个独立的应用程序之间来回复制一堆数据。

现在,我想使用 std 库通过 > 重载将其读回。它不是您可以看到的物理文件。

如果可能的话,基本上我想将 ifstream 和 ofstream 重定向到我的 void*。否则,还有哪些 std 流允许我使用指针和运算符重载?

我只知道istream,osstream。

【问题讨论】:

    标签: c++


    【解决方案1】:

    operator> 用于格式化输入和输出。听起来您正在读取和写入原始字节。您应该为此使用 istream::read 和 ostream::write。

    【讨论】:

    • 好的,我想我误解了你的问题。您想编写一个自定义流来读取和写入映射文件。这是完全不同的事情。
    • 我将 stringstream 与 rdbuf 和 pbufset 一起使用,它似乎工作得很好。是的,我正在从结构中读取/写入原始字节。我只是不喜欢每次都调用 CopyMemory。
    【解决方案2】:

    这就是 std::strstream 自 C++98 以来被弃用但尚未从 C++11 标准中删除的原因。对于它的大部分使用,有一个更好的替代方案 (std::stringstream),但没有标准替代方案来替代使用固定缓冲区的可能性。不用自己写std::streambuf,用就行了

    #include <strstream>
    
    std::strstream memostream(reinterpret_cast<char*>(mem), memsize, reinterpret_cast<char*>(mem));
    

    让一个流写入你的内存,以便在开始时写入。和

    std::strstream memistream(reinterpret_cast<char*>(mem), memsize);
    

    在它开始时读取流。

    【讨论】:

    • 还要注意std::istrstream 可以接受char const* 输入,用于只读流。
    • 这似乎解决了我眼前的问题,目前还没有迹象表明它会被删除。但我仍然为使用已弃用的功能而苦恼。
    • @CrisLuengo 我不认为它会在不替换所有用例的情况下被删除,毕竟这种缺乏是它还没有出现的原因,如果我对委员会的解读是正确的是推动对 IO 和格式化工具进行更深入的改造。朝着这个方向迈出的第一步是&lt;format&gt;。根据您的要求,您可能需要查看 std::format_to,如果 C++20 对您来说是个问题,那么标准功能所基于的 {fmt}
    【解决方案3】:

    听起来您想编写一个自定义流以从映射的内存中读取和写入。这个web page 可能会有所帮助。

    【讨论】:

    • 虽然理论上可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。这样,如果链接断开(这种情况发生的频率比您想象的要多),您的回答仍然对其他人有所帮助。
    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-16
    • 2017-02-13
    • 2018-03-03
    • 1970-01-01
    • 2018-08-24
    相关资源
    最近更新 更多