您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)c語言中如何實現(xiàn)修改文件中間的幾個字節(jié),小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
fopen的打開模式
在C語言中文件打開方式有這么幾種:
r 以只讀方式打開文件,只能讀不能寫,往文件中寫是沒有任何效果的
r+ 可以讀,也可以寫,文件打開的時候,指向文件開頭,可以通過seek改變讀寫位置
w 這種方式打開的文件句柄,只能寫,如果文件存在則將長度清零,否則新建文件,這種句柄通過seek之后,seek位置之前的文件數(shù)據(jù)全部變成0x00
w+ 同w選項,只不過多了一個可讀功能
a 這種方式打開的文件,可以寫,但是位置在文件末尾,即使往回seek也沒有用,數(shù)據(jù)還是從文件末尾開始附加
a+ 同a選項,多了可讀的功能
另外還有2個選項,可以與上面的6個選項復(fù)合使用,一個是t表示以文本的方式打開文件(默認(rèn)是t),一個是b表示以二進制的方式打開文件,t和b是互斥的不能同時使用。當(dāng)與b組合時,有這么幾種方式:wb、ab、rb、wb+、ab+、rb+,而a,w,r這幾個選項是不能組合使用的,其中a,w都表示寫文件,只不過一個在文件尾,一個在文件開始處,r表示讀文件。我試過將a,w,r幾個兩兩組合使用,發(fā)現(xiàn)下面的現(xiàn)象:
wr 與w效果一樣
rw與r效果一樣
aw與a效果一樣
wa 與w效果一樣
ar與a效果一樣
ra與r效果一樣
可以看出來當(dāng)a,w,r在一起組合使用的時候,其后面的選項實際上好像是被忽略了
問題的解決方法:rb+打開文件
所以解決文章開頭提出來的問題,應(yīng)該使用 rb+ 的方式打開文件,這種方式打開的文件,可讀,可寫,打開之后寫指針在文件開始處,可以任意seek,而seek之后寫的內(nèi)容會覆蓋被寫的內(nèi)容,其他沒有寫到的內(nèi)容不會有改變。
測試程序
//程序測試結(jié)果在ubuntu linux下運行獲得 #include <stdio.h> #include <string.h> int main() { //文件原始數(shù)據(jù) //00 01 02 03 04 05 06 07 08 09 //下面每一個fopen前面注釋中的數(shù)據(jù)是以該方式打開文件,寫文件之后文件的內(nèi)容 //00 00 00 00 CC DD //FILE * file = fopen("./test.data","wb+"); //00 00 00 00 CC DD //FILE * file = fopen("./test.data","wb"); //00 01 02 03 CC DD 06 07 08 09 FILE * file = fopen("./test.data","rb+"); //這種是正確的做法 //00 01 02 03 04 05 06 07 08 09 //FILE * file = fopen("./test.data","rb"); //00 01 02 03 04 05 06 07 08 09 CC DD //FILE * file = fopen("./test.data","ab"); //00 01 02 03 04 05 06 07 08 09 CC DD //FILE * file = fopen("./test.data","ab+"); //00 00 00 00 CC DD //FILE * file = fopen("./test.data","wr"); //00 01 02 03 04 05 06 07 08 09 //FILE * file = fopen("./test.data","rw"); //00 01 02 03 04 05 06 07 08 09 CC DD //FILE * file = fopen("./test.data","aw"); //00 00 00 00 CC DD //FILE * file = fopen("./test.data","wa"); //00 01 02 03 04 05 06 07 08 09 CC DD //FILE * file = fopen("./test.data","ar"); //00 01 02 03 04 05 06 07 08 09 //FILE * file = fopen("./test.data","ra"); if(file!=NULL) { char buffer[]={0xCC,0xDD}; fseek(file,4,SEEK_SET); fwrite(buffer,1,sizeof(buffer),file); fclose(file); } return 0; }
修改C中二進制文件中的一些字節(jié)
有沒有辦法改變二進制文件中單個字節(jié)的值?我知道如果以r b模式打開文件,光標(biāo)將位于現(xiàn)有文件的開頭,您在該文件中寫入的任何內(nèi)容都將覆蓋現(xiàn)有內(nèi)容.
但我想在一個文件中只改變1個字節(jié).我想你可以復(fù)制不應(yīng)修改的文件內(nèi)容,并在正確的位置插入所需的值,但我想知道是否還有其他方法.
我希望實現(xiàn)的一個例子:
將第3個字節(jié)更改為67
初始檔案:
00 2F 71 73 76 95
寫入后的文件內(nèi)容:
00 2F 67 73 76 95
使用fseek移動到文件中的位置:
FILE *f = fopen( "file.name", "r+b" ); fseek( f, 3, SEEK_SET ); // move to offest 3 from begin of file unsigned char newByte = 0x67; fwrite( &newByte, sizeof( newByte ), 1, f ); fclose( f );
以上就是c語言中如何實現(xiàn)修改文件中間的幾個字節(jié),小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。