如何重载std::ofstream::put()?

How to overload std::ofstream::put()?

我想将 int16_t 个值写入文件。

因此我尝试重载 std::ofstream::put() 方法。

#include <fstream>
#include <cstdint>

class Ofstream : public std::ofstream
{
public:
    Ofstream( const std::string & s) : std::ofstream(s) {}

    // for little-endian machines
    Ofstream & put(int16_t val)
    {
        char lsb, msb;
        lsb = (char)val;
        val >>= 8;
        msb = (char)val;
        put(lsb) && put(msb);
        return *this;
    }
    ~Ofstream() {}
};
int main()
{
    int16_t val = 0x1234;
    Ofstream ofile( "test");
    ofile.put(val);
}

在这里我总是得到一个分段错误,所以有什么问题?

您的 put() 函数调用自身而不是基础 class 版本。所以你得到无限递归,导致堆栈溢出。

替换

put(lsb) && put(msb);

std::ofstream::put(lsb) && std::ofstream::put(msb);

您的代码的主要问题(无限递归调用)已得到正确解答。

使用像

这样的显式范围
std::ofstream::put(lsb) && std::ofstream::put(msb);

会解决这个问题。

I want to write int16_t values to file.

尽管我的印象是您想将二进制数以网络字节顺序(大端)写入文件,而不是 put characters as text,但这不是您最终想要实现的目标。

以下是我的处理方式 (independently of the current machine architecture):

#include <fstream>
#include <arpa/inet.h>

struct Ofstream {
    std::ofstream os;

    Ofstream( const std::string & s) : os(s,std::ios_base::binary) {}

    void put(uint16_t dt) {
        uint16_t netdt = htons(dt);
        os.write((char*)&netdt,sizeof(netdt))
    }
};

int main() {
    uint16_t val = 0x1234;
    Ofstream ofile("test");
    ofile.put(val);
}

一般来说,从标准库 类 继承不是一个好主意,除非他们明确打算这样做以实现(即 std::ostream)。
而是将它们用作成员变量。