user-0 提问: 用C语言修改bin文件里面的数据

回复:
user: user-0
content: 引用 12 楼 qq523176585 的回复:楼主不要忘了添加读取文件失败后的处理嗯，谢谢解决了。

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:mmap支持大于4GB或者32GB的文件吗？ 4楼代码似乎和文件大小无关。赵老师有什么学习C的经验和总结之类的文章，或者笔记吗？或者是清晰的学习路线。如果有能发下给我吧，阿门！

user: user-0
content: 我不懂的是，我要用文件指针读出来判段，然后判断后，我又要用文件指针写进入 这一步怎么处理

user: user-1
content: 楼主不要忘了添加读取文件失败后的处理

user: user-1
content: 仅供参考 #include <stdio.h> #include <string.h>  int main() { 	FILE *fp; 	char s[1024];          /*可以设置更大的数组*/ 	char p[6]; 	int ch; 	int i = 0; 	int j; 	char *str = "05 01";    /*假定两个字节之间有一个空格*/ 	p[5] = '\0'; 	fp = fopen("1.txt","r+");    /*用你的文件名代替*.bin  */ 	while ((ch = fgetc(fp)) != EOF) 	{ 		s[i] = ch; 		i++; 	} 	s[i] = '\0'; 	for (i=0; i+5<strlen(s);) 	{ 		for (j=0; j<5; j++) 		{ 			p[j] = s[i+j]; 		} 		if ( strcmp(p,str) == 0) 		{ 			s[i+1] = '1'; 			i += 5; 		} 		else 		{ 			i++; 		} 	}  	if (!fseek(fp,0L,SEEK_SET)) 	{ 		for (i=0; i<strlen(s); i++) 		{ 			fputc(s[i],fp); 		} 	}  	fclose(fp); 	return 0; }

user: user-2
content: google 文件操作

user: user-3
content: mmap支持大于4GB或者32GB的文件吗？ 4楼代码似乎和文件大小无关。

user: user-0
content: 引用 3 楼 drlsdrls 的回复:找到组合以后记录下位置，用特定的数据写入就可以了啊  size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); 注意：这个函数以二进制形式对文件进行操作，不局限于文本文件 返回值：返回实际写入的数据块数目 （1）buffer：是一个指针，对fwrite来说，是要获取数据的地址； （2）size：要写入内容的单字节数； （3）count:要进行写入size字节的数据项的个数； （4）stream:目标文件指针； （5）返回实际写入的数据项个数count。 说明：写入到文件的哪里？ 这个与文件的打开模式有关，如果是w+，则是从file pointer指向的地址开始写，替换掉之后的内容，文件的长度可以不变，stream的位置移动count个数；如果是a+，则从文件的末尾开始添加，文件长度加大。额~不好意思！我找到原因了，我应改用scanf（“%x”，&addr）才对，现在正确了

user: user-0
content: 引用 3 楼 drlsdrls 的回复:找到组合以后记录下位置，用特定的数据写入就可以了啊  size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); 注意：这个函数以二进制形式对文件进行操作，不局限于文本文件 返回值：返回实际写入的数据块数目 （1）buffer：是一个指针，对fwrite来说，是要获取数据的地址； （2）size：要写入内容的单字节数； （3）count:要进行写入size字节的数据项的个数； （4）stream:目标文件指针； （5）返回实际写入的数据项个数count。 说明：写入到文件的哪里？ 这个与文件的打开模式有关，如果是w+，则是从file pointer指向的地址开始写，替换掉之后的内容，文件的长度可以不变，stream的位置移动count个数；如果是a+，则从文件的末尾开始添加，文件长度加大。赵老师这个问题解决了，现在遇到一个scanf（）的问题，我需要输入一个进制的数 我是这样定义的  int addr； scanf（“%s”&addr）；请问我的键盘要怎么键入了，我分别输入了0x915e ，和915e得到的结果都是错的 如果我换成scanf（“%d”&addr）；然后输入0x915e的十进制数，也就是37214 我程序运行的结果就是正切的

user: user-4
content: #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h>  #define handle_error(msg)                               \     do { perror(msg); exit(EXIT_FAILURE); } while (0)  int main(int argc, char *argv[]) {     char *addr;     int fd;     int i;     struct stat sb;     size_t length;      if (2 != argc) {         fprintf(stderr, "%s file offset [length]\n", argv[0]);         exit(EXIT_FAILURE);     }      fd = open(argv[1], O_RDWR);     if (fd == -1)         handle_error("open");      if (fstat(fd, &sb) == -1) {           /* To obtain file size */         handle_error("fstat");         exit(EXIT_FAILURE);     }      length = sb.st_size;      /* offset for mmap() must be page aligned */      addr = mmap(NULL, length, PROT_WRITE,                 MAP_SHARED, fd, 0);     if (addr == MAP_FAILED)         handle_error("mmap");      close(fd);      for (i = 1; i < length; ++i) {         if (0x05 == addr[i-1] && 0x01 == addr[i]) {             addr[i - 1] = 0x01;         }     }     msync(addr,length,MS_SYNC);      exit(EXIT_SUCCESS); }

user: user-4
content: 用mmap，就是先把文件内容映射到内存地址空间，然后直接操作内存，应该是效率比较高，处理也相对简单的一种方式。

user: user-3
content: 仅供参考#include <ctype.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXN  40 #define MAX2N 80 FILE *fi,*fo; char sn[_MAX_PATH],dn[_MAX_PATH],f[MAX2N],bw[MAXN],bf[MAXN+sizeof(int)-1],bx[MAXN],br[MAXN+sizeof(int)-1],bb[MAXN]; char *ag[MAXN]; int L,i,j,k,lenf,lenr,find,match; __int64 off; void FR() {     printf("\n");     printf("Src : %s\n",sn);     if (find==0) {         printf("Dest: %s\n",dn);     }     for (i=0;i<lenf;i++) {         bb[i]=fgetc(fi);     }     off=0i64;     while (1) {         match=1;         for (j=0;j<lenf;j++) {             if (bw[j]==0&&bf[j]==bb[j]) continue;             if (bw[j]==1) continue;             match=0;             break;//         }         if (match==1) {             printf("%016I64X\n",off);             if (find==0) {                 for (j=0;j<lenf;j++) {                     if (bx[j]==0) fputc(br[j],fo);                     else fputc(bb[j],fo);                 }             }             for (i=0;i<lenf;i++) {                 bb[i]=fgetc(fi);                 if (feof(fi)) break;//             }             if (feof(fi)&&find==0) {                 for (j=0;j<i;j++) fputc(bb[j],fo);                 break;//             }             if (feof(fi)) break;//             else off+=(__int64)lenf;         } else {             if (find==0) {                 fputc(bb[0],fo);             }             memmove(bb,bb+1,lenf-1);             bb[lenf-1]=fgetc(fi);             off++;             if (feof(fi)) {                 if (find==0) {                     for (j=0;j<lenf-1;j++) fputc(bb[j],fo);                 }                 break;//             }         }     } } int main() {     while (1) {         printf("Find & Replace, designed by zhao4zhong1@163.com\n");         printf("Src  file name:");         fflush(stdout);         fgets(sn,_MAX_PATH,stdin);         if ('\n'==sn[0]) break;//         L=strlen(sn);if ('\n'==sn[L-1]) sn[L-1]=0;         if ((fi=fopen(sn,"rb"))==NULL) {             printf("Can not open %s!",sn);             break;//         }         while (1) {             printf("Dest file name:");             fflush(stdout);             fgets(dn,_MAX_PATH,stdin);             if ('\n'==dn[0]) break;//             L=strlen(dn);if ('\n'==dn[L-1]) dn[L-1]=0;             if (strcmpi(sn,dn)==0) printf("Error: Src file name[%s] == Dest file name[%s]!\n",sn,dn);             else if ((fo=fopen(dn,"rb"))!=NULL) {                 fclose(fo);                 printf("Error: Dest file already exists!\n");             } else break;//         }         printf("Find   :");         fflush(stdout);         fgets(f,MAX2N,stdin);         L=strlen(f);if ('\n'==f[L-1]) f[L-1]=0;         if (f[0]=='\'') {             lenf=strlen(f)-1;             for (j=0;j<lenf;j++) {                 if (f[j+1]=='?') bw[j]=1;                 else {                     bw[j]=0;                     bf[j]=f[j+1];                 }             }         } else {             i=0;             for (j=0;j<MAXN;j++) {                 if (f[i]==0x0D||f[i]==0x0A||f[i]==0x1A||f[i]==0) {                     f[i]=0;                     break;//                 }                 while (f[i]==' '||f[i]==9) {                     f[i]=0;                     i++;                 }                 ag[j]=f+i;                 while (f[i]!=9&&f[i]!=' '&&f[i]!=0x0D&&f[i]!=0x0A&&f[i]!=0x00) i++;             }             lenf=j;             for (i=0;i<lenf;i++) {                 if (isxdigit(ag[i][0])) {                     bw[i]=0;                     sscanf(ag[i],"%2x",&bf[i]);                 } else {                     bw[i]=1;                 }             }         }         printf("Replace:");         fflush(stdout);         fgets(f,MAX2N,stdin);         L=strlen(f);if ('\n'==f[L-1]) f[L-1]=0;         if (f[0]==0 || '\n'==dn[0]) find=1;         else {             if (f[0]=='\'') {                 lenr=strlen(f)-1;                 if (lenr!=lenf) {                     printf("Error: Find len != Replace len");                     fclose(fi);                     break;//                 }                 find=0;                 fo=fopen(dn,"wb");                 for (j=0;j<lenr;j++) {                     if (f[j+1]=='?') bx[j]=1;                     else {                         bx[j]=0;                         br[j]=f[j+1];                     }                 }             } else {                 i=0;                 for (j=0;j<MAXN;j++) {                     if (f[i]==0x0D||f[i]==0x0A||f[i]==0x1A||f[i]==0) {                         f[i]=0;                         break;//                     }                     while (f[i]==' '||f[i]==9) {                         f[i]=0;                         i++;                     }                     ag[j]=f+i;                     while (f[i]!=9&&f[i]!=' '&&f[i]!=0x0D&&f[i]!=0x0A&&f[i]!=0x00) i++;                 }                 lenr=j;                 if (lenr!=lenf) {                     printf("Error: Find len != Replace len");                     fclose(fi);                     break;//                 }                 find=0;                 fo=fopen(dn,"wb");                 for (i=0;i<lenr;i++) {                     if (isxdigit(ag[i][0])) {                         bx[i]=0;                         sscanf(ag[i],"%2x",&br[i]);                     } else {                         bx[i]=1;                     }                 }             }         }         if (lenf<=0) break;//         FR();         fcloseall();     }     return 0; }

user: user-5
content: 找到组合以后记录下位置，用特定的数据写入就可以了啊  size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream); 注意：这个函数以二进制形式对文件进行操作，不局限于文本文件 返回值：返回实际写入的数据块数目 （1）buffer：是一个指针，对fwrite来说，是要获取数据的地址； （2）size：要写入内容的单字节数； （3）count:要进行写入size字节的数据项的个数； （4）stream:目标文件指针； （5）返回实际写入的数据项个数count。 说明：写入到文件的哪里？ 这个与文件的打开模式有关，如果是w+，则是从file pointer指向的地址开始写，替换掉之后的内容，文件的长度可以不变，stream的位置移动count个数；如果是a+，则从文件的末尾开始添加，文件长度加大。

user: user-6
content: 简单一点的，可以先把数据处理好放在buffer中，完了再整体写入。  引用 1 楼 tanqiyingk 的回复:我不懂的是，我要用文件指针读出来判段，然后判断后，我又要用文件指针写进入 这一步怎么处理