如何重载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
)。
而是将它们用作成员变量。
我想将 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
)。
而是将它们用作成员变量。