fopen的打開(kāi)模式
在C語(yǔ)言中文件打開(kāi)方式有這么幾種:
r 以只讀方式打開(kāi)文件,只能讀不能寫(xiě),往文件中寫(xiě)是沒(méi)有任何效果的
r+ 可以讀,也可以寫(xiě),文件打開(kāi)的時(shí)候,指向文件開(kāi)頭,可以通過(guò)seek改變讀寫(xiě)位置
w 這種方式打開(kāi)的文件句柄,只能寫(xiě),如果文件存在則將長(zhǎng)度清零,否則新建文件,這種句柄通過(guò)seek之后,seek位置之前的文件數(shù)據(jù)全部變成0x00
w+ 同w選項(xiàng),只不過(guò)多了一個(gè)可讀功能
a 這種方式打開(kāi)的文件,可以寫(xiě),但是位置在文件末尾,即使往回seek也沒(méi)有用,數(shù)據(jù)還是從文件末尾開(kāi)始附加
a+ 同a選項(xiàng),多了可讀的功能
另外還有2個(gè)選項(xiàng),可以與上面的6個(gè)選項(xiàng)復(fù)合使用,一個(gè)是t表示以文本的方式打開(kāi)文件(默認(rèn)是t),一個(gè)是b表示以二進(jìn)制的方式打開(kāi)文件,t和b是互斥的不能同時(shí)使用。當(dāng)與b組合時(shí),有這么幾種方式:wb、ab、rb、wb+、ab+、rb+,而a,w,r這幾個(gè)選項(xiàng)是不能組合使用的,其中a,w都表示寫(xiě)文件,只不過(guò)一個(gè)在文件尾,一個(gè)在文件開(kāi)始處,r表示讀文件。我試過(guò)將a,w,r幾個(gè)兩兩組合使用,發(fā)現(xiàn)下面的現(xiàn)象:
wr 與w效果一樣
rw與r效果一樣
aw與a效果一樣
wa 與w效果一樣
ar與a效果一樣
ra與r效果一樣
可以看出來(lái)當(dāng)a,w,r在一起組合使用的時(shí)候,其后面的選項(xiàng)實(shí)際上好像是被忽略了
問(wèn)題的解決方法:rb+打開(kāi)文件
所以解決文章開(kāi)頭提出來(lái)的問(wèn)題,應(yīng)該使用 rb+ 的方式打開(kāi)文件,這種方式打開(kāi)的文件,可讀,可寫(xiě),打開(kāi)之后寫(xiě)指針在文件開(kāi)始處,可以任意seek,而seek之后寫(xiě)的內(nèi)容會(huì)覆蓋被寫(xiě)的內(nèi)容,其他沒(méi)有寫(xiě)到的內(nèi)容不會(huì)有改變。
測(cè)試程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
//程序測(cè)試結(jié)果在ubuntu linux下運(yùn)行獲得 #include <stdio.h> #include <string.h> int main() { //文件原始數(shù)據(jù) //00 01 02 03 04 05 06 07 08 09 //下面每一個(gè)fopen前面注釋中的數(shù)據(jù)是以該方式打開(kāi)文件,寫(xiě)文件之后文件的內(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中二進(jìn)制文件中的一些字節(jié)
有沒(méi)有辦法改變二進(jìn)制文件中單個(gè)字節(jié)的值?我知道如果以r b模式打開(kāi)文件,光標(biāo)將位于現(xiàn)有文件的開(kāi)頭,您在該文件中寫(xiě)入的任何內(nèi)容都將覆蓋現(xiàn)有內(nèi)容.
但我想在一個(gè)文件中只改變1個(gè)字節(jié).我想你可以復(fù)制不應(yīng)修改的文件內(nèi)容,并在正確的位置插入所需的值,但我想知道是否還有其他方法.
我希望實(shí)現(xiàn)的一個(gè)例子:
將第3個(gè)字節(jié)更改為67
初始檔案:
00 2F 71 73 76 95
寫(xiě)入后的文件內(nèi)容:
00 2F 67 73 76 95
使用fseek移動(dòng)到文件中的位置:
1
2
3
4
5
|
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 ); |
到此這篇關(guān)于c語(yǔ)言中如何修改文件中間的幾個(gè)字節(jié)的文章就介紹到這了,更多相關(guān)修改文件中間字節(jié)內(nèi)容請(qǐng)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.cnblogs.com/wangqiguo/p/4539268.html