做畢設的過程中想實現資料的儲存,但是遇到的問題一大堆,本來打算用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.