C/C++二进制文件读写

z4zr 2013-10-23 PM 3751℃ 3条

由于需要弄几个二进制文件做配置文件的测试,所以想自己生成几个以二进制文件。。。

说道文件 估计大家都不会陌生

我们最常用的方法就是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;
标签: C/C++, 二进制

非特殊说明,本博所有文章均为博主原创。

上一篇 PHP学习笔记2
下一篇 typedef与指针

评论啦~



已有 3 条评论


  1. Youth.霖
    Youth.霖

    在手机上看,旁边的小人挡视线

    回复 2015-04-08 10:24
    1. z4zr
      z4zr 博主

      额.... 需要处理下咯。。

      回复 2015-04-08 11:53
  2. 最励志官网
    最励志官网

    不错 学习了!

    回复 2015-09-06 23:24