【问题标题】:What's the difference between opening a file with ios::binary or ios::out or both?使用 ios::binary 或 ios::out 或两者打开文件有什么区别?
【发布时间】:2011-01-14 14:22:48
【问题描述】:

我正在尝试找出打开文件的区别:

fstream *fileName*("FILE.dat",ios::binary);

fstream *fileName*("FILE.dat",ios::out);

fstream *fileName*("FILE.dat",ios::binary | ios::out);

我发现所有这些形式都是相同的:在所有情况下,文件上的相同输出都是使用*fileName*<<*fileName*.write() 生成的。

【问题讨论】:

    标签: c++ fstream


    【解决方案1】:

    ios::out 打开文件进行写入。

    ios::binary 确保数据被读取或写入,而无需在运行中与\r\n 之间转换新行字符。换句话说,你给流提供的正是所写的。

    【讨论】:

    • 两者同时使用是什么意思?
    • 好吧,你会在不翻译任何字符的情况下写入文件。
    • 因此,如果我不将 ifstream 标记为二进制,并从中读取 10 个双精度数,并且 Windows 在数据中找到一个随机 '\n',那么流将从 @987654324 扩展@ 到 10*sizeof(double) +1 作为 \r 被插入,然后覆盖我的双缓冲区的结尾?
    【解决方案2】:

    使用 ios::binary 打开文件控制如何处理换行符。在 Windows 上,它们被扩展为 CRLF 对。就是这样 - 它对 operator

    【讨论】:

    • CLRF 代表回车换行。这是用于在 Windows 文本编码中指定新行的两个字节。这主要是多余的,因为在计算机上,你真的只需要一个换行符。
    • 很久以前,在电传打字机和打字机时代,输出机器的车厢在打印字符时向左移动以进行书写。一个命令Carriage Return 将马车移回左侧。另一个命令Linefeed 将论文推进到下一行。这两个命令可以独立执行,以便论文前进中线(使用Linefeed)或重写当前行(使用Carriage Return)。作为一对,它们使打印从下一行的左边距开始。
    • Unix 人,作为不耐烦的打字员,决定计算机应该同时处理 Carriage ReturnsLinefeeds,通过减少输入字符来提高工作效率。这个新命令被称为Newline。在某些输出系统上,您可以看到每个Newline 的托架向左移动并且纸张前进,包括空白行。 C 语言决定妥协,让操作系统提供翻译(没有ios::binary)或不提供翻译(有ios::binary)。 ios::out 确定数据方向(从计算机输出)。
    • 谢谢你先生。 Thomas,你能告诉我使用 ios::binary 和 ios::out 的区别吗?用于打开文件的 ios::binary 是否相同?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    相关资源
    最近更新 更多