一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - c語言中如何修改文件中間的幾個字節

c語言中如何修改文件中間的幾個字節

2021-09-28 10:59薰衣草的旋律 C/C++

工作中碰到一個問題,如何只修改文件中間的幾個字節,而其他的內容不變。這個問題看似簡單,但是很多人估計都不知道怎么做。我開始seek到文件的特定的位置,然后寫文件,但是使用的文件打開模式不對,文件不是被清空,就

fopen的打開模式

在C語言中文件打開方式有這么幾種:

r 以只讀方式打開文件,只能讀不能寫,往文件中寫是沒有任何效果的
r+ 可以讀,也可以寫,文件打開的時候,指向文件開頭,可以通過seek改變讀寫位置
w 這種方式打開的文件句柄,只能寫,如果文件存在則將長度清零,否則新建文件,這種句柄通過seek之后,seek位置之前的文件數據全部變成0x00
w+ 同w選項,只不過多了一個可讀功能
a 這種方式打開的文件,可以寫,但是位置在文件末尾,即使往回seek也沒有用,數據還是從文件末尾開始附加
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幾個兩兩組合使用,發現下面的現象:

wr 與w效果一樣
rw與r效果一樣
aw與a效果一樣
wa 與w效果一樣
ar與a效果一樣
ra與r效果一樣
可以看出來當a,w,r在一起組合使用的時候,其后面的選項實際上好像是被忽略了

問題的解決方法:rb+打開文件

所以解決文章開頭提出來的問題,應該使用 rb+ 的方式打開文件,這種方式打開的文件,可讀,可寫,打開之后寫指針在文件開始處,可以任意seek,而seek之后寫的內容會覆蓋被寫的內容,其他沒有寫到的內容不會有改變。

測試程序

?
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
//程序測試結果在ubuntu linux下運行獲得
#include <stdio.h>
#include <string.h>
int main()
{
  //文件原始數據
  //00 01 02 03 04 05 06 07 08 09
 
  //下面每一個fopen前面注釋中的數據是以該方式打開文件,寫文件之后文件的內容
   
  //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中二進制文件中的一些字節

有沒有辦法改變二進制文件中單個字節的值?我知道如果以r b模式打開文件,光標將位于現有文件的開頭,您在該文件中寫入的任何內容都將覆蓋現有內容.

但我想在一個文件中只改變1個字節.我想你可以復制不應修改的文件內容,并在正確的位置插入所需的值,但我想知道是否還有其他方法.

我希望實現的一個例子:

將第3個字節更改為67

初始檔案:

00 2F 71 73 76 95

寫入后的文件內容:

00 2F 67 73 76 95

使用fseek移動到文件中的位置:

?
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 );

到此這篇關于c語言中如何修改文件中間的幾個字節的文章就介紹到這了,更多相關修改文件中間字節內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/wangqiguo/p/4539268.html

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
主站蜘蛛池模板: 久久五月综合婷婷中文云霸高清 | 2019国内自拍大神视频 | 国产精品中文 | 欧美女孩videos | 国产精品女同久久免费观看 | 欧美一级视频在线高清观看 | 久久久久国产一级毛片高清片 | 精品视频免费在线观看 | 国产精品高清视亚洲一区二区 | 欧美特黄三级在线观看 | 美女扒开腿让男人桶爽免费gif | 91av导航| 亚洲免费视频一区二区三区 | 亚洲精品中文字幕在线 | 久久精麻豆亚洲AV国产品 | 九九精品国产兔费观看久久 | 希望影院高清免费观看视频 | 亚洲mv国产精品mv日本mv | 91真人毛片一级在线播放 | 4s4s4s4s色大众影视 | 国产第9页| 免费全看男女拍拍拍的视频 | 婷婷在线成人免费观看搜索 | 三极片在线观看 | 99re热 | 爽好舒服把腿张小说 | 国产美女亚洲精品久久久久久 | 国产精品男人的天堂 | 精品视频在线免费观看 | 99久久精品在免费线18 | 每天都要睡男人(nph) | 美女的隐私脱裤子无遮挡 | 青青草国产免费久久久91 | 亚洲欧美日韩中文字幕久久 | 91久久精品国产一区二区 | 1024国产高清精品推荐 | 日本三级大学生17 | 国产精品视频一区二区三区不卡 | 久久亚洲精品中文字幕60分钟 | 香蕉91xj.cc | 亚洲一区二区日韩欧美gif |