这种为了方便的二进制输出而继承C++ fstream的实现是如何导致打开文件失败的?

问题描述 投票:0回答:1

代码输出,“文件未打开。”

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 可以正常打开。

c++ inheritance binary output fstream
1个回答
0
投票

您在构造函数中构造了一个临时的

fstream
。当构造函数完成后,临时的
fstream
将被关闭。此外,
_Ios_Openmode
是内部实现特定类型。不要使用那些。

已修复:

enhancedfstream(const std::string& s, std::ios_base::openmode iosom)
    : std::fstream(s, iosom) // now opened correctly
{}
© www.soinside.com 2019 - 2024. All rights reserved.