【问题标题】:Is there a function in C++ that creates a .bin file, or is this code missing something?C++ 中是否有创建 .bin 文件的函数,或者这段代码缺少什么?
【发布时间】:2009-05-26 01:22:57
【问题描述】:

我的代码如下所示:

int main () {
  fstream file;
  file.open("test.bin", ios::out | ios::binary);
  if(!file.is_open())
  {
      return -1;
  }
  int n = 3;
  file.write(reinterpret_cast<char*>(&n), sizeof(n));
  file.close();
  return 0;
}

当我单独运行它时,它以-1退出,因此显然它无法打开“test.bin”。但是,如果我将一个空白记事本文件保存为“test.bin”并运行它,它就可以正常工作。我想知道的是,如果名为“test.bin”的文件尚不存在,我如何让我的 C++ 程序自动生成一个空文件“test.bin”。

【问题讨论】:

  • 再试一次。由于您将 ios::in 更改为 ios::out,所以它工作得很好。
  • 它与file.write无关,因为程序在file.write之前到达return -1,问题是它根本没有打开test.bin,导致程序在到达file.write之前结束。
  • 该程序在我的 VS2008 下运行良好,因此您可能想查看该文件是否已经存在,它的权限是什么,您尝试在哪个目录中创建它等等。代码很好。它创建 bin 文件,然后写入整数 3。失败时的 rdstate() 是什么?

标签: c++ file-io binary-data


【解决方案1】:

您的代码 sn-p 是错误的,因为它试图写入您为输入而打开的文件。如果要写入文件,只需使用ios::out 而不是ios::in

如果您想打开文件进行读取,但如果文件不存在则创建它,您可以使用:

file.open("test.bin", ios::in | ios::binary);
if(!file.is_open()) {
    file.open("test.bin", ios::out | ios::binary);
    int n = 3;
    file.write(reinterpret_cast<char*>(&n), sizeof(n));
    file.close();
    file.open("test.bin", ios::in | ios::binary);
    if(!file.is_open()) {
        return -1;
    }
}

这将使用整数 3 作为默认内容初始化文件,如果它不存在的话。

如果确实存在,它将不理会内容。无论哪种情况,您都会在第一个字节处打开文件。

【讨论】:

    【解决方案2】:

    我假设您可以通过打开和关闭文件来做到这一点:

    if (GetFileAttributes("test.bin") == INVALID_FILE_ATTRIBUTES)
    {
        fstream file;
        file.open("test.bin", ios::out);
        file.close();
    }
    

    【讨论】:

    • 是的,这会创建一个空的 test.bin。 +1。
    • 可能值得注意的是 GetFileAttributes 是特定于 Windows 的(这对 OP 来说很好,但未来的到来可能会关心)。
    • 在 POSIX 系统上使用 stat (2)。
    • 为什么你认为这对 OP 来说很好?标签不表示 MSVC。记事本表示 Windows,但 MSVC 不是该平台的唯一编译器,Win32 API 也不一定可用。 @Keand64,如果您需要 Win32 解决方案,请重新标记/指明,否则我们应该坚持标准。
    【解决方案3】:

    一种选择是打开读/写并寻找文件的开头。

    然后,您可以阅读、写作或做任何您想做的事情。

    【讨论】:

    • ios:app 将强制 all 写入文件末尾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2019-07-26
    • 2017-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    相关资源
    最近更新 更多