由參數(shù)b的想到的

字號(hào):

在使用PHP的時(shí)候,以前有時(shí)會(huì)用到fopen(), 現(xiàn)在經(jīng)常用file_get_contents(),當(dāng)時(shí)看到他們的參數(shù)表中都有”b”這個(gè)參數(shù),那個(gè)時(shí)候也沒多留意,只知道是二進(jìn)制(binary)的意思。最近特地觀察了下,才發(fā)現(xiàn)這個(gè)參數(shù)原來是指定打開的文件是否二進(jìn)制文件,再說的正確些,指的是是否以二進(jìn)制方式打開文件。
    進(jìn)一步研究后又得到了一些結(jié)果,因?yàn)長inux對(duì)于二進(jìn)制文件和文本文件并不區(qū)分,所以在Linux下使用上述兩個(gè)函數(shù)時(shí)加不加”b”這個(gè)參數(shù)并無區(qū)別,但是在Windows下就有區(qū)別了。當(dāng)Windows以二進(jìn)制方式打開一個(gè)文件時(shí)和Linux是一樣的,但是當(dāng)以文本方式打開文件是,會(huì)自動(dòng)對(duì)文件做一些轉(zhuǎn)換(translate),一個(gè)例子是換行符。在Linux中換行符是”\n”,無論是二進(jìn)制文件還是文本文件都是如此。但是在Windows中,文本文件里的換行符是”\r\n”,這就會(huì)造成一些文件操作時(shí)的麻煩,所以有必要指定是否以二進(jìn)制方式(參數(shù)b)打開文件或者以文本方式(參數(shù)t)打開文件。
    從C語言方面來看,也是如此。以下三個(gè)函數(shù)是C中標(biāo)準(zhǔn)I/O庫中用來打開文件所用的函數(shù)。
    FILE *fopen(const char *pathname, const char *type) ;
    FILE *freopen(const char *pathname, const char *type, FILE *fp) ;
    FILE *fdopen(int filedes, const char *type) ;
    其中的type參數(shù)指定對(duì)該I/O流的讀、寫方式,具體如下
    type 說明
    r 或rb 為讀而打開
    w 或wb 使文件成為0長,或?yàn)閷懚鴦?chuàng)建
    a 或ab 添加; 為在文件尾寫而打開,或?yàn)閷懚鴦?chuàng)建
    r+或r+b 或rb+ 為讀和寫而打開
    w+或w+b或wb+ 使文件為0長,或?yàn)樽x和寫而打開
    a+或a+b或ab+ 為在文件尾讀和寫而打開或創(chuàng)建
    其中的b就是指是否以二進(jìn)制方式打開文件。相信PHP的源代碼中的C就是這么寫的。
    雖然在Linux中并不需要特意指定這個(gè)參數(shù),但是值得注意的是,為了保證可移植性,或者說在不確定以后是否會(huì)移植到別的操作系統(tǒng),比如說Windows,那么,還是加上比較好。