一:fopen()中的第二引數(模式引數)的格式詳解
可用來組合的字元有:r,w,a,t,+,b,它們分別代表的意義為:
它們可以拿來互相組合,構成不同的開啟模式,比如常見的有:
"r" 開啟檔案用於讀,若檔案不存在,則出錯fopen返回null,初始位置指標位於檔案第乙個位元組(亦 即第乙個字元)上。
"w" 開啟檔案用於寫,若檔案不存在,則按所給檔名建立新檔案;若檔案存在,則要清除原檔案中的所有內容,並將初始位置指標置於檔案第乙個位元組處(其實在這兒就是eof)上。在以"w"模式打 開的檔案中,也不可以做任何如fgetc()之類的讀取操作,否則後果不可預計。
"a" 開啟檔案用於追加內容,若檔案不存在,則按所給檔名建立新檔案,然後追加;若檔案存在,則將位置指標置於檔案末尾,也就是eof上,以下程式可驗證:
file * fp=fopen("4.txt","a");
if(fp==null)
if(fgetc(fp)==eof)
它的輸出是eof。我想系統內部的操作應該是判斷是否為eof,如果是,則覆蓋之,再在檔案末尾 插入乙個eof,若不是,則從下乙個位元組寫起。當然上面的**實際不可取,因為以"a"方式開啟的檔案,你在並沒有轉移位置指標的情況下就fgetc(),而fgetc()完了會將位置指標移到下乙個位元組,可是當前已是eof,下乙個位元組將移往何處呢?上面我想到了轉移位置指標,但我拿 rewind()測試時:
file * fp=fopen("4.txt","a");
if(fp==null)
rewind(fp);
if(fgetc(fp)==eof)
仍然要輸出eof,可見rewind()在以"a"模式開啟的檔案流中沒有起作用,然後我將rewind()那行換為fseek(fp,0l,seek_set);仍然要輸出eof,可見以"a"模式開啟的檔案只能在檔案末尾追加,且最好不要在其中做任何讀取操作,這個可不太好。
"ra" "rw" "aw" 之類的組合不會引起編譯錯誤(vc6.0中),但是意義本來就相悖,也不會這麼用。
"r+" 開啟檔案以讀和寫,若檔案不存在,則發生錯誤,若檔案存在,則開啟之,初始位置指標指向文 件第乙個位元組,此時你使用fputc()向檔案輸入字元,會發現你輸入的字元把原檔案位置指標指 向的字元覆蓋掉了(而不是插入),同樣,每個fputc()完了要將當前位置指標後移乙個位元組。如 果你認為指定了那樣的開啟模式,你就可以交錯的進行讀取和插入操作的話,那你就錯了,c語言標準制定時,為了保持與過去不能同時進行讀寫操作的程式的向下相容性,乙個輸入操作後面不能直接跟乙個輸出操作,反之亦然,如果要同時進行輸入和輸出操作, 必須在其間插入 fseek()操作,fseek( f, 0l, seek_cur);以上關於r+的這段內容來自<像這種問題真稱得上陷阱,幸虧早先知道了,要不出這麼個bug,可折騰死人了。
"w+" 開啟檔案以讀和寫,若檔案不存在,則建立之,若存在,則要清空原來的內容,從檔案頭寫起。其實我覺得"w+"與"w"無甚區別。
"a+" 開啟或建立文字檔案用於更新,寫檔案時追加到檔案末尾。也應該與"a"沒區別吧。
如果在上述訪問模式之後再加上b,如"rb","w+b"等,則表示對進製檔案進行操作。
二:關於fclose()
大家都知道fclose()是用來關閉開啟的檔案流的,它斷開由fopen()函式建立的檔案指標和外部名之間的連線,交釋放檔案指標以供其它檔案使用。因為大多數系統都限制了乙個程式可以同時開啟的檔案數,所以,當檔案指標不再需要時就應該釋放,這是乙個好的程式設計習慣。對輸出檔案執行fclose()還有另乙個原因:它將緩衝區中由fputc()正在收集的輸出寫入到檔案中。當程式正常終止時,程式會自動為每個開啟的檔案呼叫fclose()函式。
三:高手們給我做的補充:
(1):fclose()會在檔案尾加乙個eof標誌.
(2):fclose 操作後,
才會將所有的輸入內容從緩衝中真正的寫到檔案中 ...
這些內容不僅僅是 fputc 函式寫的,
還有其他函式 ...
(3): 可加的字尾為t、b。加b表示檔案以二進位制形式進行操作,t沒必要使用
例:┌──────────────────┐
│#include│
│main() │
│fputs(strcat(s, scat), fp2);
fclose(fp);
fclose(fp2);
system("pause"); //有必要的話重新命名 test2.txt 為原來的檔案就 ok
return 0;
}tailzhou(尾巴) ( ) 信譽:100 2006-8-11 21:10:34 得分: 0
改了下斑竹的,不需要strcat連線.
int main()
fclose(fp);
fclose(fp2);
system("pause"); //有必要的話重新命名 test2.txt 為原來的檔案就 ok
return 0;
}wiali(維埃裡) ( ) 信譽:99 2006-8-12 1:06:21 得分: 0
fgets(s+idx, 256-idx, fp);
--贊乙個
/我靠,有這麼複雜嗎?我心裡沒底了,得,我把檔案操作認真看一遍,再來做這個題目,現在還沒認真看完呢我就知道了,他這個問題還就得如大牛們那麼做哈,沒想到c語言把乙個簡單的字元插入搞得如此之複雜,也許有什麼原因吧。唉,我的c語言功底就是如此不濟,但願看完這遍有點成效。
關於檔案操作別的函式,用到了再總結。
C語言程式備忘錄
1 編寫乙個將輸入複製到輸出的程式,並將其中連續多個空格用乙個空格代替。解1 注 從沒想到,無中生有也可以用在這裡。光靠c語言本身力量真的很有限。解2 解3 include void main 注 這個有點意思。看似空格乙個也沒輸出,但最後還是輸出了。關鍵在 當 pre ch 非空格而 ch 為空格...
語言基礎 c 備忘錄
1.c 整數型別範圍 可以參照標頭檔案limits.h 定義的巨集 define int max 2147483647 32bit,最大10 位十進位制 define uint max 4294967295u 32bit,最大10 位十進位制 define llong max 92233720368...
C C 以及Linux檔案操作備忘錄
目錄c 檔案操作 linux檔案操作 includestdin,stdout,stderr檔案開關 r rb 唯讀。不存在返回null,開啟成功不會清空檔案 w wb 只寫。不存在建立,開啟成功後清空檔案 a ab 只寫。不存在建立,開啟成功不會清空檔案 r rb 讀寫兼備。不存在返回null,開啟...