今天我們要說的是文件的操作,一直在黑乎乎的控制臺上操作想必大家都厭煩了,心想是不是可以把信息寫在txt等文件里面呢?當然是可以的,接下來我們就說說文件的讀寫。 大家還記得我們在開始說gets()這個函數(shù)的時候我們順便便說了一個fgets()嗎?當時我們說這個函數(shù)是gets的文件版本,而且是一個安全版本,當時我們沒有細說,留待以后再說,今天該是我們說這個函數(shù)的時候了,不過在說這個函數(shù)之前,我們先來看看fopen()。 fopen()顧名思義就是open file的意思,他是以文件名為參數(shù),同時返回一個指向文件結(jié)構(gòu)的指針。例如我們要是想要打開一個名為“l(fā)izi.txt”的文件,我們以讀寫模式來打開。 ----------------------- FILE * fp; fp = fopen('lizi.txt','r|w'); ------------------------ 通常情況下,我們要判斷我們要開打的文件是否被打開,如果打開,fopen便是指向FILE的指針,如果打開失敗,便返回一個空指針。 還記得我們的fgets()函數(shù)的原型嗎?他的第三個參數(shù)就是一個FILE的指針,所以當?shù)玫竭@個指針之后,我們便可以將該指針傳遞給fgets,然后就能夠讀取該打開文件的內(nèi)容了。 和fgets匹配的便是fputs,我們可以將這個fgets讀取的字符串通過fputs輸出,可以在標準框里輸入,也可以把他輸入指定的文件之中。我們來看看下面的這個例子: -------------------------------------- #include ----------------------------------------- 我們在該程序的文件里建發(fā)文本文檔,然后命名為“l(fā)izi',然后在里面輸入Hello world。然后我們運行程序,可以看到標準輸出Hello world。大家如果有興趣,可以嘗試一下其他的。 大家嘗試過之后可能會問,為什么只能讀取第一行呢?是啊,問題出在那里呢?我們再來看看fgets()這個函數(shù)吧。 fgets()他可以讀取一連串的字符串,但是會在碰到回車后停止讀取,所以他讀取我們的第一行。那么有沒有辦法讓把整個文件讀完呢?答案是肯定的,我們可以通過使用一個循環(huán)來完成,但是大家是不是又想問,用循環(huán)的話那怎么控制循環(huán)呢? 每個文件都有一個結(jié)尾符,便是End Of File,在C/C++里,我們稱它為EOF,而fgets同樣不例外,在遇到eof之后便不會再讀取了,所以我們便利用這一點來控制這個循環(huán)。又由于fgets()返回一個指向char的指針,這將和eof類型不同,在這里我們不能強制轉(zhuǎn)換,如果你要是轉(zhuǎn)換,那就是出大事了,既然不能轉(zhuǎn)換的話該怎么辦呢?我們可以這么想,如果fgets()沒東西可以讀取,那么返回的豈不是NULL指針嗎?所以我們將程序這么改一下: ------------------------------------ #include ----------------------------------------- 我們這樣一修改,就能夠讀取所有的內(nèi)容了。 那么,我們要怎么才能將文件寫入另一個文件呢?大家還記得fputs()的第二參數(shù)是什么嗎? fputs的第二個參數(shù)便是FILE的指針,所以我們可以創(chuàng)建一個文本文件,然后把指向他的指針傳遞給fputs(),便可以把文件信息寫入該文本。怎么獲得這個指針呢?我們依然可以用fopen()這個函數(shù)來獲得該指針。 ----------------------------------- FILE *file2; file2 = fopen('write','w'); ------------------------------------ fopen的第二個參數(shù)現(xiàn)在是w,這個w的意義是打開一個文件用來進行更新寫操作,第一個參數(shù)是要打開的文件名,當然如果不存在該文件的話,便會創(chuàng)建該文件。所以如果要想把文件從一個文本寫入另一個文本之中,我們可以把上面的代碼修改一下即可,如下:
------------------------------------ #include FILE* file2; file2 = fopen('write.txt','w'); ----------------------------------------- 再次運行便會發(fā)現(xiàn)在我們的目錄下多了一個名叫write的文本文件,打開看一下會發(fā)現(xiàn)里面的內(nèi)容和我們原文件相同。 說到此處,那么我們怎么才能運行期打開一個文本文件呢?為了更好的說明這種使用法,我們來看下面的例子: ------------------------------------ #include FILE* file2; puts('請輸入要打開的文本文件:'); gets(name1); file = fopen(name1,'r'); file2 = fopen(name2,'w'); ------------------------------------ 在輸入文件名時記得帶上路徑,比如說如果我們想要打開一個D盤下面的文件,我們可以這么寫: D:\\lizi.txt 注意到了嗎?我們這里用了兩個\\,還記得我們以前的那些轉(zhuǎn)義符嗎?很多都是要添加一個\,我們用得最多的就是換行了\n,所以如果我們想要獲取一個\,那么就要輸入兩個\\。同樣對于我們的目標文件,同樣還要這么寫,不過不添加地址,就會自動在我們的程序目錄生成這個文件。 關(guān)于文件的讀取,今天就說到這里吧,下面還有幾個函數(shù)呢,我在想是要大家去自己研究呢還是我拿出來說一下呢?我先想想吧。
===================== 回復D&d直接查看目錄 |
|
來自: 昵稱29398856 > 《第三天》