關(guān)于文件的操作,我們說了不少了,雖然說得不深,但是一般的應(yīng)用能夠應(yīng)付了,不過還有一點得說一下,那就是當(dāng)我們打開一個文件,我們要什么地方讀取信息呢?是要從一開始呢還是從當(dāng)前位置還是從末尾添加呢?為了解決這個問題,我們今天來探討一下文件的定位。 大家還記得我們怎么訪問數(shù)組的嗎?如果要是我們像訪問數(shù)組內(nèi)容一樣的訪問fopen打開的文件一樣的話豈不是很方便呢?是啊,fseek這個函數(shù)就是現(xiàn)實這個功能的,我們可以通過fseek訪問文件像訪問數(shù)組一樣的方便,那么fseek是怎么工作呢?我想既然已經(jīng)提出這個問題,想必大家都一定很好奇了吧。 為了明白一個函數(shù)的用法,我們要先明白他的原型,下面是我們在MSDN上看到的原型: ---------------------------------------- int fseek( 從這個原型里面,我們可以看到這個函數(shù)需要三個參數(shù),第一個參數(shù)是FILE的指針,也就是我們打開文件fopen的返回指針。第二參數(shù)是偏移量,我們要想訪問文件像訪問數(shù)組一樣簡單就是靠這個參數(shù)。第三個參數(shù)就是讀取模式,這個參數(shù)有三種類型: ----------------------------------------- SEEK_SET 文件開始 SEEK_CUR 當(dāng)前位置 SEEK_END 文件結(jié)尾 ------------------------------------------- 第二個參數(shù)要起作用就是靠這第三個參數(shù),第三個參數(shù)就是第二個參數(shù)偏移的原地,可以為負(fù),可以為正,當(dāng)為負(fù)的時候表示向后移,若為正表示向前移,下面我們來看下這個例子: -------------------------------------- #include ------------------------------------------ 我們先準(zhǔn)備一個txt文件,里面輸入如下內(nèi)容: ------------------------------------------- //lizi.txt #include -------------------------------------------- 然后我們再來看下輸出: 程序反向輸出,實現(xiàn)這一功能的就是靠fseek辦到的,fseek將文件定位在文件尾部,所以從尾部一個個字符讀取,所以打印出來的是從后到前打印出來。 大家要是注意的話里面出現(xiàn)了一個我們沒有接觸過的函數(shù),就是ftell(),這個函數(shù)正是我們今天要說的,他是配合fseek一起使用的。所以還是老規(guī)矩,我們先看看這個函數(shù)的原型: ------------------------------ long ftell( ----------------------------- 這個函數(shù)返回從文件開頭到定位處的字符個數(shù),是一個long類型。所以在我們得到這個long值后 ,我們就可以用一個for循環(huán)控制輸出。 fseek和ftell這對函數(shù)有個極限性,那就是限定文件在long范圍內(nèi),為了解決的這個問題,我們來看看另外一對函數(shù): ------------------------------------ int fgetpos (FILE * restrict stream, fpos_t * restrict pos); int fsetpos (FILE * stream, const fpos_t *pos); ------------------------------------ 這對函數(shù)里使用了一個叫做fpos_t的類型做參數(shù),fpos_t不是什么基類型,而是通過其他類型定義的,關(guān)于fpos_t,有興趣的同學(xué)可以去查一下,我就不多說,不過一般來說,fseek和ftell就足夠了,試想2億字符的文件有多大?所以,除非是超大文件,否則,fseek就足夠了。 C語言部分說到這里,不知道算不算差不多了,如果有什么還想要知道的,大家可以提問,如果沒什么問題,我想我們是不是可以開始嘗試一下簡單的windows編程呢?至于C++,我們打算在說完window編程再說。不過還是看大家的意見。 ==================== 回復(fù)D&d直接查看目錄 |
|
來自: 昵稱29398856 > 《第三天》