【问题标题】:Appending and reading binary file追加和读取二进制文件
【发布时间】:2017-02-07 03:33:13
【问题描述】:

我很困惑我的代码哪里出错了。输出不是 1,2,3,而是 1,1,1。关于我能做什么的任何建议?我猜我的错误在于写入数据或使用变量值时。

class Binary
{
 public:
   Binary(int num);
  ~Binary();

  void createBinary();
  void writeBinary();
  void readBinary();

  string binFile;
  int value;
  fstream binaryFile;
};

Binary::Binary(int num)
{
 value = num;
 binFile = "BinaryFile.bin";
}

Binary::~Binary()
{
}

void Binary::createBinary()
{
  binaryFile.open(binFile, ios::out | ios::binary);
  binaryFile.close();
}

void Binary::writeBinary()
{
  if (!binaryFile) //if file does not exist
  {
    createBinary();
  }

  binaryFile.open(binFile, ios::app | ios::binary);
  binaryFile.write((char*)&value, sizeof(value));
  binaryFile.close();
}

void Binary::readBinary()
{

  binaryFile.open(binFile, ios::in |ios::binary);
  binaryFile.read((char*)&value, sizeof(value));
  binaryFile.close();

  cout << value << ", ";
}



int main()
{
  Binary num1(1);
  Binary num2(2);
  Binary num3(3);

  num1.writeBinary();
  num2.writeBinary();
  num3.writeBinary();

  num1.readBinary();
  num2.readBinary();
  num3.readBinary();


  return 0;
}

【问题讨论】:

  • 小测验:readBinary() 每次调用它的 3 次都读取了文件的哪一部分?您的多项选择答案是: 1. 不知何故,它神奇地知道之前调用readBinary() 已读取文件的哪一部分,并向前跳到文件的下一部分,或者 2. 始终是文件的开头。你有 30 秒的时间来回答。时钟开始滴答作响……现在。
  • 更简单地说:打开文件一次,反复读取,然后关闭。
  • 它应该在文件的开头读取
  • 对。那么,为什么每次调用readBinary() 都会从文件开头读取相同的值?

标签: c++ binary append


【解决方案1】:

由于您使用单个文件并从每个 Binary()::readBinary() 开始读取,因此您的结果符合预期。为每个对象使用不同的文件。

// In general we may need some random part in name but for this special case,
// since you are just writing / reading value, the following seems to work.

Binary::Binary(int num)
{
    value = num;
    binFile = "BinaryFile";    // common start
    binFile += std::to_string(value);    // differentiator
    binFile += ".bin";    // extension
}

或者,如果您想使用同一个文件,请尝试从静态变量中获取帮助,以免一次又一次地读取同一行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    相关资源
    最近更新 更多