欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c語(yǔ)言中如何修改文件中間的幾個(gè)字節(jié)

 更新時(shí)間:2020年10月04日 13:00:03   作者:薰衣草的旋律  
工作中碰到一個(gè)問(wèn)題,如何只修改文件中間的幾個(gè)字節(jié),而其他的內(nèi)容不變。這個(gè)問(wèn)題看似簡(jiǎn)單,但是很多人估計(jì)都不知道怎么做。我開(kāi)始seek到文件的特定的位置,然后寫文件,但是使用的文件打開(kāi)模式不對(duì),文件不是被清空,就是被截?cái)?,達(dá)不到效果

fopen的打開(kāi)模式

在C語(yǔ)言中文件打開(kāi)方式有這么幾種:

r 以只讀方式打開(kāi)文件,只能讀不能寫,往文件中寫是沒(méi)有任何效果的
r+ 可以讀,也可以寫,文件打開(kāi)的時(shí)候,指向文件開(kāi)頭,可以通過(guò)seek改變讀寫位置
w 這種方式打開(kāi)的文件句柄,只能寫,如果文件存在則將長(zhǎng)度清零,否則新建文件,這種句柄通過(guò)seek之后,seek位置之前的文件數(shù)據(jù)全部變成0x00
w+ 同w選項(xiàng),只不過(guò)多了一個(gè)可讀功能
a 這種方式打開(kāi)的文件,可以寫,但是位置在文件末尾,即使往回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都表示寫文件,只不過(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)的文件,可讀,可寫,打開(kāi)之后寫指針在文件開(kāi)始處,可以任意seek,而seek之后寫的內(nèi)容會(huì)覆蓋被寫的內(nèi)容,其他沒(méi)有寫到的內(nèi)容不會(huì)有改變。

測(cè)試程序

//程序測(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)文件,寫文件之后文件的內(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)頭,您在該文件中寫入的任何內(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

寫入后的文件內(nèi)容:

00 2F 67 73 76 95

使用fseek移動(dòng)到文件中的位置:

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)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言中回調(diào)函數(shù)的使用詳情

    C語(yǔ)言中回調(diào)函數(shù)的使用詳情

    這篇文章主要介紹了C語(yǔ)言中回調(diào)函數(shù)的使用詳情,閱讀下文我們將學(xué)習(xí)到架構(gòu)的核心理念和需、回調(diào)函數(shù)的作用、回調(diào)函數(shù)的程序編寫等內(nèi)容,需要的小伙伴可以參考一下
    2022-03-03
  • C++11實(shí)現(xiàn)簡(jiǎn)易定時(shí)器的示例代碼

    C++11實(shí)現(xiàn)簡(jiǎn)易定時(shí)器的示例代碼

    這篇文章主要介紹了C++11實(shí)現(xiàn)簡(jiǎn)易定時(shí)器的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 從C語(yǔ)言過(guò)渡到C++之const

    從C語(yǔ)言過(guò)渡到C++之const

    C++中最早引入const是為了替代#define,后來(lái)又衍生出了其它用法。這一篇中我們來(lái)詳細(xì)介紹const的各種常見(jiàn)用法。希望對(duì)大家學(xué)習(xí)C++有所幫助。
    2017-07-07
  • 淺析C語(yǔ)言中strtol()函數(shù)與strtoul()函數(shù)的用法

    淺析C語(yǔ)言中strtol()函數(shù)與strtoul()函數(shù)的用法

    這篇文章主要介紹了淺析C語(yǔ)言中strtol()函數(shù)與strtoul()函數(shù)的用法,注意其將字符串轉(zhuǎn)換成long型的區(qū)別,需要的朋友可以參考下
    2015-08-08
  • c++基礎(chǔ)使用STL的注意點(diǎn)詳解

    c++基礎(chǔ)使用STL的注意點(diǎn)詳解

    這篇文章主要為大家介紹了c++基礎(chǔ)使用STL的注意點(diǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++?Boost?weak_ptr智能指針超詳細(xì)講解

    C++?Boost?weak_ptr智能指針超詳細(xì)講解

    智能指針是一種像指針的C++對(duì)象,但它能夠在對(duì)象不使用的時(shí)候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個(gè)
    2022-11-11
  • 基于C++字符串替換函數(shù)的使用詳解

    基于C++字符串替換函數(shù)的使用詳解

    本篇文章是對(duì)C++字符串替換函數(shù)的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 利用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷

    利用C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-02-02
  • 關(guān)于python調(diào)用c++動(dòng)態(tài)庫(kù)dll時(shí)的參數(shù)傳遞問(wèn)題

    關(guān)于python調(diào)用c++動(dòng)態(tài)庫(kù)dll時(shí)的參數(shù)傳遞問(wèn)題

    這篇文章主要介紹了python調(diào)用c++動(dòng)態(tài)庫(kù)dll時(shí)的參數(shù)傳遞,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘

    QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07

最新評(píng)論