c語言中如何修改文件中間的幾個字節(jié)
fopen的打開模式
在C語言中文件打開方式有這么幾種:
r 以只讀方式打開文件,只能讀不能寫,往文件中寫是沒有任何效果的
r+ 可以讀,也可以寫,文件打開的時候,指向文件開頭,可以通過seek改變讀寫位置
w 這種方式打開的文件句柄,只能寫,如果文件存在則將長度清零,否則新建文件,這種句柄通過seek之后,seek位置之前的文件數(shù)據(jù)全部變成0x00
w+ 同w選項,只不過多了一個可讀功能
a 這種方式打開的文件,可以寫,但是位置在文件末尾,即使往回seek也沒有用,數(shù)據(jù)還是從文件末尾開始附加
a+ 同a選項,多了可讀的功能
另外還有2個選項,可以與上面的6個選項復合使用,一個是t表示以文本的方式打開文件(默認是t),一個是b表示以二進制的方式打開文件,t和b是互斥的不能同時使用。當與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效果一樣
可以看出來當a,w,r在一起組合使用的時候,其后面的選項實際上好像是被忽略了
問題的解決方法:rb+打開文件
所以解決文章開頭提出來的問題,應該使用 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模式打開文件,光標將位于現(xiàn)有文件的開頭,您在該文件中寫入的任何內(nèi)容都將覆蓋現(xiàn)有內(nèi)容.
但我想在一個文件中只改變1個字節(jié).我想你可以復制不應修改的文件內(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 );
到此這篇關(guān)于c語言中如何修改文件中間的幾個字節(jié)的文章就介紹到這了,更多相關(guān)修改文件中間字節(jié)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux?C/C++?timeout命令實現(xiàn)運行具有時間限制功能
inux?timeout命令的一個屬性是時間限制??梢詾槿魏蚊钤O(shè)置時間限制。如果時間到期,命令將停止執(zhí)行,這篇文章主要介紹了Linux?C/C++?timeout命令實現(xiàn)(運行具有時間限制),需要的朋友可以參考下2023-02-02
C++簡明圖解分析靜態(tài)成員與單例設(shè)計模式
與靜態(tài)數(shù)據(jù)成員不同,靜態(tài)成員函數(shù)的作用不是為了對象之間的溝通,而是為了能處理靜態(tài)數(shù)據(jù)成員,靜態(tài)成員函數(shù)沒有this指針。既然它沒有指向某一對象,也就無法對一個對象中的非靜態(tài)成員進行默認訪問2022-06-06
C語言中交換int型變量的值及轉(zhuǎn)換為字符數(shù)組的方法
這篇文章主要介紹了C語言中交換int型變量的值及轉(zhuǎn)換為字符數(shù)組的方法,講解了以不同進制將整型數(shù)字轉(zhuǎn)換成字符數(shù)組,需要的朋友可以參考下2016-04-04
C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[])
這篇文章主要介紹了C++ 動態(tài)內(nèi)存分配詳解(new/new[]和delete/delete[]),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-05-05
MFC實現(xiàn)在文件尾追加數(shù)據(jù)的方法
這篇文章主要介紹了MFC實現(xiàn)在文件尾追加數(shù)據(jù)的方法,涉及MFC文件操作的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-09-09
C++?實現(xiàn)單鏈表創(chuàng)建、插入和刪除
這篇文章主要介紹了C++?實現(xiàn)單鏈表創(chuàng)建、插入和刪除方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

