日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C++中隨機(jī)存取文件的處理

和許多的C++程序一樣,有些人更喜歡用原先的C語(yǔ)言方式處理問(wèn)題,如果你恰好也是這些人中的一員,就應(yīng)該學(xué)習(xí)一下這篇文章。

基本的文件操作有

◆fopen——打開(kāi)文件,指定文件以怎樣的方式打開(kāi)(讀/寫(xiě))以及類(lèi)型(二進(jìn)制/文本)

◆fclose——關(guān)閉已經(jīng)打開(kāi)的文件

◆fread——讀取文件

◆fwrite——寫(xiě)文件

◆fseek/fsetpos——將文件指示器轉(zhuǎn)移到文件中的某一地方

◆ftell/fgetpos——可以告訴你文件指示器所在的位置

文件有兩種基本類(lèi)型:文本和二進(jìn)制。在這兩者之中,通常二進(jìn)制類(lèi)型是較容易解決的。由于在文本中處理隨機(jī)存取并不常用,我們會(huì)在本文中重點(diǎn)關(guān)注二進(jìn)制文件的處理。上面列出的操作中的前四項(xiàng)可用于文本文件和隨機(jī)存取文件。后面的兩項(xiàng)則僅用于隨機(jī)存取。

隨機(jī)存取意味著我們可以在文件的任意部分之間進(jìn)行切換,且可以從中讀寫(xiě)數(shù)據(jù)而不需要通讀整篇文件。

二進(jìn)制文件

二進(jìn)制文件是任意長(zhǎng)度的文件,它保存有從0到0xff(0到255)不等的字節(jié)值。這些字節(jié)在二進(jìn)制文件中沒(méi)有任何意義,與此不同的是,在文本文件中,值為13就意味著回車(chē),10意味著換行,26意味著文件結(jié)束,而讀取文本文件的軟件要能夠解決這些問(wèn)題。

在現(xiàn)在的術(shù)語(yǔ)中,我們將二進(jìn)制文件稱(chēng)為包含了字節(jié)的字符流,大多數(shù)語(yǔ)言傾向于將其理解為字符流而不是文件。重要的部分是數(shù)據(jù)流本身而不是其來(lái)源。在C語(yǔ)言中,你能從文件或數(shù)據(jù)流方面來(lái)考慮數(shù)據(jù)。或者,你可以將其理解為一組長(zhǎng)的數(shù)組。通過(guò)隨機(jī)存取,你可以讀寫(xiě)數(shù)組的任意部分。

      例一:
// ex1.c : Defines the entry point for the console application.

//

#include < stdio.h>

#include < string.h>

#include < windows.h>

int FileSuccess(FILE * handle,const char * reason, const char * path) {

OutputDebugString( reason );

OutputDebugString( path );

OutputDebugString(" Result : ");

if (handle==0)

{

OutputDebugString("Failed");

return 0;

}

else

{

OutputDebugString("Suceeded");

return 1;

}

}

int main(int argc, char * argv[])

{

const char * filename="test.txt";

const char * mytext="Once upon a time there were three bears.";

int byteswritten=0;

FILE * ft= fopen(filename, "wb");

if (FileSuccess(ft,"Opening File: ", filename)) {

fwrite(mytext,sizeof(char),strlen(mytext), ft);

fclose( ft );

}

printf("len of mytext = %i ",strlen(mytext));

return 0;

}
 

這段代碼顯示了一個(gè)簡(jiǎn)單的打開(kāi)待寫(xiě)的二進(jìn)制文件,文本字符(char*)會(huì)寫(xiě)入該文件。通常你會(huì)使用文本文件但是筆者想證明你可以向二進(jìn)制文件寫(xiě)入文本。

     // ex1.c

     #include < stdio.h>

     #include < string.h>

     int main(int argc, char * argv[])

    {

     const char * filename="test.txt";

     const char * mytext="Once upon a time there were three bears.";

     int byteswritten=0;

     FILE * ft= fopen(filename, "wb") ;

     if (ft) {

     fwrite(mytext,sizeof(char),strlen(mytext), ft) ;

     fclose( ft ) ;

     }

      printf("len of mytext = %i ",strlen(mytext)) ;

     return 0;

     }
 

例一的作用

這個(gè)例子打開(kāi)了一個(gè)待寫(xiě)的二進(jìn)制文件。FILE*變量從fopen()調(diào)用中返回。如果這一操作失敗那么它會(huì)返回為0。

Fopen()命令試圖打開(kāi)指定的文件,在這個(gè)案例中則是位于相同文件夾的test.txt。記住,如果文件包含一個(gè)路徑那么所有的退格必須重疊?!癱:\folder\test.txt”是錯(cuò)誤的,你必須使用“c:\\folder\\test.txt”。

由于文件樣式是wb,我們正準(zhǔn)備寫(xiě)入二進(jìn)制文件。如果文件不存在則系統(tǒng)會(huì)創(chuàng)建一個(gè)文件,如果存在,則里面的內(nèi)容都會(huì)被刪除。如果調(diào)用fopen失敗了,或許由于文件被打開(kāi)了,或者其名稱(chēng)包括無(wú)效字符又或者一個(gè)無(wú)效路徑那么fopen會(huì)返回0值。

雖然你可以只檢查ft是否為0(值為0則成功),但是筆者還是添加了一個(gè)FileSuccess()函數(shù)來(lái)確保這一操作。在窗口中,它會(huì)顯示調(diào)用是否成功以及文件名稱(chēng)。如果你失敗了則可能需要修復(fù)。注意在Windows中一般沒(méi)有多少輸出文本可供系統(tǒng)調(diào)試器使用,

 fwrite(mytext,sizeof(char),strlen(mytext), ft) ; fwrite()調(diào)用輸出了指定文本。第二,三個(gè)參數(shù)分別是字符的大小和字符串的長(zhǎng)度。它們兩個(gè)都是被size_t定義了。注意有了二進(jìn)制文件后,即便你正在向文件中寫(xiě)入(char*)字符串,它也沒(méi)有任何附加換行字符。如果你想要這些字符,你必須明確將這些字符包含到字符串中。

讀寫(xiě)文件

打開(kāi)一個(gè)文件的時(shí)候,必須指定打開(kāi)的方式。這意味著如果你打算要為文件附加?xùn)|西,那么是否要?jiǎng)?chuàng)建新文件并對(duì)其進(jìn)行覆蓋?它是文本文件還是二進(jìn)制文件呢?是要讀取文件還是要寫(xiě)文件呢?這樣要通過(guò)使用一個(gè)或更多的文件模式分類(lèi)符來(lái)完成,文件模式分類(lèi)符是一些單獨(dú)的字母“r”,“b”,“w”,“a”和+。“r”意思是打開(kāi)文件以便讀取。如果文件不存在或找不到文件這一操作會(huì)失敗?!皐”意思是待寫(xiě)方式或空文件方式打開(kāi)文件。如果文件存在,則文件內(nèi)容會(huì)被損壞?!癮”表示打開(kāi)文件,并準(zhǔn)備從文件末端寫(xiě)入而不需要在寫(xiě)入新數(shù)據(jù)前刪除EOF標(biāo)記;如果不存在該文件則首先會(huì)創(chuàng)建一個(gè)文件。向文件模型添加+會(huì)創(chuàng)建下列三種新模型:

“r+”打開(kāi)文件等待讀取或?qū)懭?。“w+”以空文件方式打開(kāi)文件等待讀取或?qū)懭?。如果文件存在,則文件內(nèi)容會(huì)被損毀。

“a+”打開(kāi)文件等待讀取或添加,添加的操作包括新數(shù)據(jù)寫(xiě)入前EOF標(biāo)記的移除,以及寫(xiě)入完成后EOF標(biāo)記的保存,如果文件不存在則先要?jiǎng)?chuàng)建文件。

下面的列表顯示了字碼組合包括文本的和二進(jìn)制文件的。通常你可以選擇從文本文件中讀取或?qū)懭胛募?,但是不要兩者同時(shí)使用。

就二進(jìn)制文件而言,你可以選擇對(duì)相同文件進(jìn)行讀取和寫(xiě)入的操作。列表告訴了我們可以用字碼進(jìn)行哪些操作。

       Mode Type of file Read Write Create Truncate 
r text Read

rb+ binary Read

r+ text Read Write

r+b binary Read Write

rb+ binary Read Write

w text Write Create Truncate

wb binary Write Create Truncate

w+ text Read Write Create Truncate

w+b binary Read Write Create Truncate

wb+ binary Read Write Create Truncate

a text Write Create

ab binary Write Create

a+ text Read Write Create

a+b binary Write Create

ab+ binary Write Create
 

就筆者的經(jīng)驗(yàn)來(lái)看,除非你剛剛創(chuàng)建完文件或讀取完文件,否則你通過(guò)使用“w+b”只能僥幸成功。

還有一些情況允許其他字母存在。例如微軟運(yùn)行“t”代表文本模式,“c”用于認(rèn)可,“n”用于非認(rèn)可,“S”為順序存取優(yōu)化緩沖,“R”代表隨機(jī)存取,“T”代表臨時(shí)性而“D”用于 刪除/臨時(shí)性保存。

使用二進(jìn)制文件的主要原因是可以獲得靈活性;你可以讀取或?qū)懭胛募娜我獠糠帧N谋疚募荒茏屇惆凑枕樞蜃x取或?qū)懭搿,F(xiàn)在隨著SQLite或MySQL數(shù)據(jù)庫(kù)的普及,在二進(jìn)制文件中使用隨機(jī)存取的需要減少了。從某種意義上說(shuō),隨機(jī)存取文件記錄有點(diǎn)老土了,但是仍然還是有用的。

筆者在數(shù)據(jù)庫(kù)普及之前就使用過(guò)基于隨機(jī)存取文件的多種數(shù)據(jù)處理方案。例如,在小文件中,筆者使用的是 索引/數(shù)據(jù) 文件模式。該模式包括兩個(gè)文件。一個(gè)是數(shù)據(jù)文件,它保存了一些長(zhǎng)短不一的記錄。另一種文件是索引文件,這樣的文件擁有同樣的記錄作為數(shù)據(jù)文件。但是在索引文件中每個(gè)記錄的長(zhǎng)度相同而且都由兩個(gè)適合結(jié)構(gòu)的部分組成。

struct {??fpos_t pos;??int size; } indexrec; 

類(lèi)型fpos_t是由fsetpos()和fgetpos()定義和使用的執(zhí)行。這些是fseek和ftell更新的版本且更有助于創(chuàng)建書(shū)簽。如果你正在計(jì)算文件聞之且需要設(shè)定文件那么你應(yīng)該使用fseek(),另外ftell()也可以給你int的當(dāng)前位置。

在實(shí)際操作中,fpos_t可能只是一個(gè)int但是你應(yīng)該使用fpos_t類(lèi)型。它保存了當(dāng)前文件指示器的副本。這是隨機(jī)存取文件的屬性,它表明了下一次讀取或?qū)懭氲奈恢谩K牧6葹橐?,因此你可以將其放在文件的任意位置?/p>

【編輯推薦】

  1. C++、Java與C#的命名規(guī)范總結(jié)
  2. 在C++中使用Lambda函數(shù)提高代碼性能
  3. 給C++初學(xué)者的50條建議

分享文章:C++中隨機(jī)存取文件的處理
瀏覽地址:http://www.5511xx.com/article/djojegd.html