时间:2020-10-06来源:www.pcxitongcheng.com作者:电脑系统城
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语言中如何修改文件中间的几个字节的文章就介绍到这了
2024-07-07
Java框架如何实现非阻塞式编程?2023-03-11
Android Jetpack 组件LiveData源码解析2023-03-11
hbuilderx设置Firefox浏览器安装路径教程 hbuilderx怎么设置Firefox浏览器安装路径?一、AVL树的概念 二、AVL树节点的定义 三、AVL树的插入 四、AVL树的旋转 1.左单旋 2.右单旋 3.左右双旋 4.右左双旋 五、进行验证 六、AVLTree的性能...
2023-03-09