Linux檔案結構FILE,與普通open,read,write對比__Linux

來源:互聯網
上載者:User

做畢設的過程中想實現資料的儲存,但是遇到的問題一大堆,本來打算用sqlite的,但是由於儲存速度及複雜性,還是用file實現。

1. linux 中 open ,read, write 這些都是用來寫檔案描述符的,但是對於檔案操作還是不是很清楚。。。

。。。。。。。。。先MARK一下。。。。。。。。。

2.讀取的時候總是只能讀一行, fread, fwrite, fclose。


3.寫資料的時候唯寫一行,在FILE結構中,要用 at

檔案使用方式               意 義

“rt”      唯讀開啟一個文字檔,只允許讀資料  “wt”      唯寫開啟或建立一個文字檔,只允許寫資料 “at”      追加開啟一個文字檔,並在檔案末尾寫資料 “rb”      唯讀開啟一個二進位檔案,只允許讀資料 “wb”       唯寫開啟或建立一個二進位檔案,只允許寫資料 “ab”       追加開啟一個二進位檔案,並在檔案末尾寫資料 “rt+”      讀寫開啟一個文字檔,允許讀和寫 “wt+”      讀寫開啟或建立一個文字檔,允許讀寫 “at+”      讀寫開啟一個文字檔,允許讀,或在檔案末追加資料 “rb+”      讀寫開啟一個二進位檔案,允許讀和寫  “wb+”      讀寫開啟或建立一個二進位檔案,允許讀和寫 “ab+”      讀寫開啟一個二進位檔案,允許讀,或在檔案末追加資料


4.FILE中用的EOF=-1,這個看看下面的

(1) 位元組的讀取 
在正常的情況下, getc 以 unsigned char 的方式讀取檔案流, 擴張為一個整數,並返回. 換言之, getc 從檔案流中取一個位元組, 並加上24個零,成為一個小於256的整數,然後返回.

int c; 
while ((c = fgetc (rfp))!= -1) // -1就是 EOF 
fputc (c, wfp); 

上面 fputc 中的 c 雖然是整數, 但在 fputc 將其寫入檔案流之前, 又把整數的高24位去掉了, 因此 fgetc, putc 配合能夠實現檔案複製. 到目前為止, 把 c 定義為 char仍然是可行的, 但下面我們將看到,把 c 定義為 int 是為正確判段檔案是否結束. 


(2) 判斷檔案結束. 
多數人認為檔案中有一個EOF,用於表示檔案的結尾. 但這個觀點實際上是錯誤的,在文 件所包含的資料中,並沒有什麼檔案結束符. 對getc 而言, 如果不能從檔案中讀取, 則返回一個整數 -1,這就是所謂的EOF. 返回 EOF 無非是出現了兩種情況,一是檔案已經讀完; 二是檔案讀取出錯,反正是讀不下去了. 


請注意: 在正常讀取的情況下, 返回的整數均小於256, 即0x0~0xFF. 而讀不出返回的是 0xFFFFFFFF. 但, 假如你用fputc把 0xFFFFFFFF 往檔案裡頭寫, 高24位被屏蔽,寫入的將是 0xFF. // lixforalpha 請注意這一點 


(3) 0xFF 會使我們混淆嗎? 


不會, 前提是, 接收傳回值的 c 要按原型定義為 int. 
如果下一個讀取的字元將為 0xFF, 則 

int c; 
c = fgetc (rfp); // c = 0x000000FF; 
if (c != -1)     // 當然不等, -1 是 0xFFFFFFFF 
fputc (wfp);    // 噢, OXFF 複製成功. 


字元0xFF, 其本身並不是EOF. 


(4) 將 c 定義 char 

假定下一個讀取的字元為 0xFF 則 

char c; 
c = fgetc (rfp); // fgetc(rfp)的值為 0x000000FF, 暗中降為位元組, 


c = 0xFF 
if (c != -1)     // 字元與整數比較? c 被帶符號(signed)擴充為


0xFFFFFFFF, 喔噢, 
條件成立,檔案複製提前退出.  


while ((c=fgetc(rfp))!=EOF) 中的判別條件成立, 檔案複製結束! 意


外中止. 


(5) 將 c 定義為 unsigned char; 


當讀到檔案末尾, 返回 EOF 也就是 -1 時, 


unsigned char c; 
c = fgetc (rfp); // fgetc (rfp)的值為EOF,即-1,即0xFFFFFFFF, 降


格為位元組, c=0xFF 
if ( c!= -1)   // c 被擴充為 0x000000FF, 永遠不回等於 


0xFFFFFFFF 


所以這次雖然能正確複製 0xFF, 但卻不能判斷檔案結束. 事實上,在 c 


為 uchar 時, 
c != -1 是永遠成立的, 一個高品質的編譯器, 比如 gcc會在編譯時間指


出這一點. 


(6) 為何需要feof? 
FILE *fp;  
fp 指向一個很複雜的資料結構, feof 是通過這個結構中的標誌來判斷


檔案是否結束的. 
如果檔案用 fgetc 讀取, 剛好把最後一個字元讀出時, fp 中的EOF標誌


不會開啟,這時 
用feof判斷,將會得到檔案尚未結束的結論. 


fgetc 返回 -1 時, 我們仍無法確信檔案已經結束, 因為可能是讀取錯


誤! 這時我們 
需要 feof 和 ferror.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.