代码输出,“文件未打开。”
union converter_t {
char byte[4];
short int word[2];
int dword[1];
} converter;
class enhancedfstream: public fstream {
public:
enhancedfstream(string s, _Ios_Openmode iosom) {
fstream(s, iosom);
}
void write(int i) {
converter.dword[0] = i;
fstream::write(converter.byte, 4);
}
void write(short int si) {
converter.word[0] = si;
fstream::write(converter.byte, 2);
}
void write(string s) {
char* tca = &s[0];
fstream::write(tca, s.length());
}
void write(char c) {
fstream::write(new char[1] {c}, 1);
}
void write(char* cp, int i) {
fstream::write(cp, i);
}
};
.
.
.
enhancedfstream fs(fn, fstream::out | fstream::binary | fstream::trunc);
if (fs.is_open()) {} else cout << "file not open\n";
来自 shell 的 Linux 文件系统检查显示空文件创建成功,但以编程方式,该文件显示为未打开,后续写入无效。编译和执行是在根目录的子目录中以 root 身份完成的。在 ipadOs iSH 1.3.2(内部版本 494)中使用模拟 g++ (Alpine 10.3.1_git20210424) 10.3.1 20210424 (C++14)(版权所有 2020)编译。
上面实现的继承是否做得不正确,或者 fstream 的独特之处在于如何成功地子类化?缓冲区设置是否无人值守?标准报告的 fstream 打开失败原因似乎不存在,除非空缓冲区导致打开失败。具有相同规格的非子类 fstream 可以正常打开。
您在构造函数中构造了一个临时的
fstream
。当构造函数完成后,临时的 fstream
将被关闭。此外,_Ios_Openmode
是内部实现特定类型。不要使用那些。
已修复:
enhancedfstream(const std::string& s, std::ios_base::openmode iosom)
: std::fstream(s, iosom) // now opened correctly
{}