【问题标题】:in C++ files: what a file opened as an ios::binary differs from one opened as ios::binary | ios::out?在 C++ 文件中:以 ios::binary 形式打开的文件与以 ios::binary 形式打开的文件有何不同 | ios::out?
【发布时间】:2010-02-09 17:41:10
【问题描述】:

如果我打开了类似的文件:

ofstream file("file.dat",ios::binary);

ofstream file("file.dat",ios::binary | ios::out);

我可以用后一种形式打开的文件做什么,而我不能用前一种形式做,反之亦然

谢谢

【问题讨论】:

    标签: c++ fstream


    【解决方案1】:

    对于ofstream,ios::out 是默认值,因此没有区别。我相信唯一指定 ios::out 会有所不同的是您是否使用 fstream,它可以打开以进行读取或写入,或两者兼而有之。

    【讨论】:

    • 不,如果您使用 fstream,您既不能写入 ios::out 也不能​​写入 ios::in,您仍然可以从文件中写入和读取.. 并非总是如此不写 ios::out 一样的写法?
    • @Imengineer:我必须检查以确保,但如果内存服务,默认情况下会为输入和输出打开 fstream,但如果您指定 ios::out,它只会打开用于输出,如果您指定 ios::in,它只为输入而打开。这是从记忆中得出的,但绝对不能保证。
    【解决方案2】:

    在大多数情况下,我希望没有区别,尽管这似乎在技术上可能是特定于实现的。

    在我的实现(gcc 3.4.3)中,ofstream 的 open 在 ofstream->open() 调用中使用 ios:::out 模式,无论通过构造函数指定什么,因此它完全是可选的。如果使用 fstream,则情况并非如此,需要明确指定。

    【讨论】:

      【解决方案3】:

      查看标准,第 27.8.1.3 节讨论了各种 ios 修饰符(如 ios::inios::out),并将它们映射到 C fopen() 参数。根据标准,如果打开的文件没有指定修饰符,则打开失败。

      在 27.8.1.9 中,我们发现 ofstream 的工作方式类似,但自动指定了 ios::out。因此,原始问题的答案是两者的工作方式完全相同。

      我不知道为什么人们会发现以fstream 开头而没有ios::inios::out,但我对标准的阅读表明它不应该工作。我会对其他人对 27.8.1.3 的阅读感兴趣。

      【讨论】:

      • 在哪里可以找到这个标准??
      【解决方案4】:

      感谢所有回答我的人: 我现在根据我得到的回答测试了几个代码并得出了这个摘要:

      使用 ofstream: ios::out 是默认值,即使未指定任何内容,但如果您仅将 ios::in 与 ofstream 一起使用,则不会出现编译错误(除非您使用 read() 或 >> 或某些 ifstream 对象)但不会写入文件。

      使用 ifstream: ios::in 是默认值,即使未指定任何内容,但如果您仅使用 ios::out 和 ifstream,则不会出现编译错误(除非您使用 write() 或

      使用 fstream: 没有默认值,您必须明确确定要做什么。否则,没有编译错误,但你没有得到你想要的。

      至于原始问题,两者的工作原理完全相同!

      【讨论】:

        猜你喜欢
        • 2011-01-14
        • 2018-12-30
        • 2015-09-27
        • 2023-03-19
        • 2017-10-26
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        相关资源
        最近更新 更多