由于需要弄几个二进制文件做配置文件的测试,所以想自己生成几个以二进制文件。。。
说道文件 估计大家都不会陌生
我们最常用的方法就是FILE *fp = fopen("path","rw");
下面就介绍一下如何将内容以二进制的方算式写入文件
注意:使用fprintf(fp,"%b",num);的方式输出会以字符0或1输出到文本文件并非真正的二进制文件哦
同理fscanf也是读取文本的0或1
这里使用fwrite和fread进行写和读取二进制文件
#include<stdio.h>
#include<string.h>
int main()
{
int a=0xFFFFFFFF;
char b=0xDD;
char str[]="z4zr";
FILE *fp = fopen("test","w+b");
fwrite((void*)&a,1,sizeof(int),fp);
fwrite((void*)&b,1,sizeof(char),fp);
fwrite((void*)str,strlen(str),sizeof(char),fp);
fclose(fp);
return 0;
}
//执行完程序后 可以使用十六进制编辑器查看文件 本人一直喜欢WinHex
//用WinHex查看的结果
FF FF FF FF DD 7A 34 7A 72
//额 由于只需要产生二进制文件所以读取没有去弄,,
把度娘上面的例子搬过来
#include<stdio.h>
#include<string.h>
int main(){
FILE *fp;
char msg[] = "z4zr";
char buf[20];
if((fp = fopen("data","w+"))==NULL){
return 0;
}
fwrite(msg,strlen(msg)+1,1,fp);
fseek(fp,0,SEEK_SET);
fread(buf,strlen(msg)+1,1,fp);
printf("%s\n",buf);
fclose(fp);
return 0;
}
下面是可能会用到的函数的介绍
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+,则从文件的末尾开始添加,文件长度加大。
fseek对此函数有作用,但是fwrite函数写到用户空间缓冲区,并未同步到文件中,所以修改后要将内存与文件同步可以用fflush(FILE *fp)函数同步。
size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;
返回值:实际读取的元素个数.如果返回值与count不相同,则可能文件结尾或发生错误.
(1)buffer 用于接收数据的内存地址,大小至少是size*count字节.
(2)size 单个元素的大小,单位是字节
(3)count 元素的个数,每个元素是size字节.
(4)stream 目标文件指针
从ferror和feof获取错误信息或检测是否到达文件结尾.
int fseek(FILE *stream, long offset, int origin);
stream 目标文件指针;
offset 相对于origin规定的偏移位置量;如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。
origin:表示指针移动的起始位置,可设置为以下三种情况之一:
SEEK_SET: 文件开始位置
SEEK_CUR: 文件当前位置
SEEK_END: 文件结束位置
fseek返回的是一个整型。
成功,返回0,失败返回-1,并设置errno的值,可以用perror()函数输出错误。
long ftell(FILE *stream);
用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。使用fseek函数后再调用函数ftell()就能非常容易地确定文件的当前位置。
如果想获取文件的长度只需要这样
fseek(fp, 0L,SEEK_END);
len =ftell(fp)+1;
在手机上看,旁边的小人挡视线
额.... 需要处理下咯。。
不错 学习了!