作者:依然-狠幸福 | 2023-08-09 16:57
我试图找出打开文件之间的区别,如:
fstream *fileName*("FILE.dat",ios::binary);
要么
fstream *fileName*("FILE.dat",ios::out);
要么
fstream *fileName*("FILE.dat",ios::binary | ios::out);
我发现,所有这些形式是相同的:在所有情况下,即使用产生该文件上的相同的输出*fileName*<<
或*fileName*.write()
.
1> Nick Bedford..:
ios::out
打开文件进行写作.
ios::binary
确保读取或写入数据,而无需动态地转换新行字符\r\n
.换句话说,你给流提供的正是你所写的内容.
因此,如果我没有将ifstream标记为二进制文件,并且从中读取10个双精度数,并且Windows在数据中找到随机的'\n',那么流将从`10*sizeof(double)`扩展为`插入10*sizeof(double)+ 1`作为`\ r``,然后覆盖我的双缓冲区的结尾?
2> 小智..:
使用ios :: binary打开文件控制如何处理换行符.在Windows上,它们扩展为CRLF对.就是这样 - 它对运算符<<的运行方式没有影响.
Unix人员,不耐烦的打字员,决定计算机应该处理"回车"和"换行",通过键入较少的字符来提高工作效率.这个新命令叫做"换行符".在某些输出系统上,您可以看到托架向左移动,纸张前进为每个"换行符",包括空行.C语言决定实现和平并让操作系统提供翻译(不使用`ios :: binary`)或不提供翻译(使用`ios :: binary`).`ios :: out`确定数据方向(*从计算机输出*).
很久以前,在Teletypes和打字机的时代,输出机器的车厢在打印字符时向左移动.一个命令,"回车",将马车向左移动.另一个命令"Linefeed"将纸张推进到下一行.这两个命令可以独立执行,以便纸张在中线前进(使用"Linefeed")或重写当前行(使用"Carriage Return").作为一对,它们使打印从下一行的左边缘开始.
CLRF代表回车,换行.这些是用于在Windows文本编码中指定新行的两个字节.它几乎是多余的,因为在计算机上,你真的只需要一个换行符.