打开文件函数中的b标记是什么意思?

7

阅读关于php fopen的文档文档,我看到了以下内容:

为了便携性,在使用fopen()打开文件时,强烈建议始终使用“b”标志。

b标志是什么?它是用来做什么的?
为什么强烈建议使用?


9
它提供了关于你所陈述内容的更多信息。它强制执行二进制模式。"在处理二进制文件时,如果您不指定'b'标志,可能会出现奇怪的数据问题,包括损坏的图像文件和\r\n字符产生的奇怪问题。" - Ekin
@Ekn 为什么不回答呢? :) - Diligent Key Presser
@DiligentKeyPresser 好的,已经添加为答案,但是起初我其实想把问题标记一下,因为答案有点在问题本身里面 :p - Ekin
1
你的问题中引用的注意事项上方已经有一份解释了。请仔细阅读。 - axiac
1个回答

14

'b'标记强制使用二进制模式。

如果您要处理二进制文件(例如图像),则需要使用'b'标记。

注意:

当您编写文本文件并希望插入换行符时,您需要使用适用于您的操作系统的正确换行字符。

基于Unix的系统使用 \n 作为行尾字符,基于Windows的系统使用 \r\n 作为行尾字符,而基于Macintosh的系统使用 \r 作为行尾字符。

Windows提供了一个文本模式转换标记('t'),可以在处理该文件时将 \n 透明地转换为 \r\n

相比之下,您还可以使用“b”来强制使用二进制模式,这不会翻译您的数据。

您可以在mode参数中使用“b”标记来避免翻译。例如:

$handle_read  = fopen($filepath, 'rb');

$handle_write = fopen("/home/user/file.gif", "wb");

因此... 推荐使用'b'标志的原因在手册中已经清楚地说明:manual
如果您在处理二进制文件时未指定'b'标志,可能会遇到数据方面的奇怪问题,包括损坏的图像文件和\r\n字符方面的奇怪问题。
在二进制安全的文件读/写函数fwrite()和fread()的手册页面上也有关于使用'b'标志的说明。
警告: 在区分二进制和文本文件(例如Windows)的系统上,必须在fopen()模式参数中包含'b'来打开文件。
$filename = "c:\\files\\somepic.gif";
$handle   = fopen($filename, "rb");
$contents = fread($handle, filesize($filename));
fclose($handle);

4
文档似乎不是很清晰。听起来好像我应该对文本和二进制文件都这样做。实际上,我只需要针对二进制文件(如图像或音频)进行此操作。 - nelaaro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接