精华内容
下载资源
问答
  • C语言读写二进制文件

    千次阅读 2017-07-20 14:35:04
    可以这么说,除了文本文件以外的所有文件都是二进制文件二进制文件相对于文本文件更容易修改。因为文本文件的修改,需要修改以后写入内存,然后再清空原文件,再从内存中读取出修改以后的内容到本文件中。二进制...
    可以这么说,除了文本文件以外的所有文件都是二进制文件。二进制文件相对于文本文件更容易修改。因为文本文件的修改,需要修改以后写入内存,然后再清空原文件,再从内存中读取出修改以后的内容到本文件中。二进制文件修改只需要找到特定的字符,然后对它进行修改。
    
    对二进制文件进行操作主要用到fopen,fread,fwrite,fseek等函数。
    

    完整代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct stu
    {
        int id;
        char name[10];
        int age;
    };    //定义一个学生结构体
    
    struct stu s1;
    
    void read_file(char *filename)
    {
        FILE *fd = fopen(filename,"rb"); 
        if(fd == NULL)
        {
            perror("open failed!");
            exit(1);        //出错、退出
        }
    
        fread(&s1,sizeof(s1),1,fd);
        printf("%d %d %s\n",s1.id,s1.age,s1.name);
    
        fclose(fd);
    }
    
    //写入文件
    void write_file(char *filename)
    {
        FILE *fd = fopen(filename,"wb");
        s1.id=77;
        s1.age=17;
        strcpy(s1.name,"yang");
    
        if(fd == NULL)
        {
            perror("open failed!");
            exit(1);
        }
    
        fwrite(&s1,sizeof(s1),1,fd);
        fclose(fd);
    
    }
    
    //修改文件
    void modify(char *filename)
    {
        FILE *fd = fopen(filename,"rb+");
        if(fd == NULL)
        {
            perror("open failed!");
            exit(1);
        }
    
    
        while(1)
        {
    
            int res = fread(&s1,sizeof(s1),1,fd);
            if(res <= 0)
            {
                break;
            }
    
            if(s1.id == 77)  //通过查找id=77的位置来修改该结构体成员
            {
                s1.age=22;
                strcpy(s1.name,"yangni");
                fseek(fd,-sizeof(s1),SEEK_CUR); //设置偏移量
                fwrite(&s1,sizeof(s1),1,fd);
                break;
            }
        }
    
    
    }
    
    
    int main()
    {
        write_file("test.txt");
        read_file("test.txt");
        modify("test.txt");
    
        printf("%d %d %s\n",s1.id,s1.age,s1.name);
    
        read_file("test.txt");
    
        return 0;
    }

    主要函数:

    1、fopen()

    FILE * fopen(const char * path, const char * mode);

    FILE *fd = fopen(filename,"rb"); 
        if(fd == NULL)
        {
    
            perror("open failed!");
            exit(1);        //出错、退出
        }
    
    • path字符串包含欲打开的文件路径及文件名
    • 参数 mode 表示文件打开方式

    参数mode:

    字符串 说明
    r 以只读方式打开,且文件必须存在
    r+ 以读/写方式打开文件,该文件必须存在
    rb+ 以读/写方式打开一个二进制文件,只允许读/写数据
    rt+ 以读/写方式打开一个文本文件,允许读和写
    w 打开只写文件,若文件存在则长度清为 0,即该文件内容消失,若不存在则创建该文件
    w+ 打开可读/写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
    a 附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留(EOF 符保留)
    a+ 以附加方式打开可读/写的文件。若文件不存在,则会建立该文件,如果文件存在,则写入的数据会被加到文件尾后,即文件原先的内容会被保留(原来的 EOF 符不保留)
    wb 以只写方式打开或新建一个二进制文件,只允许写数据
    wb+ 以读/写方式打开或建立一个二进制文件,允许读和写
    ab+ 以读/写方式打开一个文本文件,允许读或在文本末追加数据

    2、fread()

    size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;

    返回值:返回实际写入的数据块数目

    从文件流中读数据,最多读取count个项,每个项size个字节,如果调用成功返回实际读取到的项个数(小于或等于count),如果不成功或读到文件末尾返回0

    • buffer 用于接收数据的内存地址

    • size 要读的每个数据项的字节数,单位是字节

    • count 要读count个数据项,每个数据项size个字节.

    • stream 输入流


    3、fwrite()

    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。


    4、fseek()

    int fseek(FILE *stream, long offset, int fromwhere);

    函数设置文件指针stream的位置。如果执行成功,stream将指向以fromwhere(偏移起始位置:文件头0(SEEK_SET),当前位置1(SEEK_CUR),文件尾2(SEEK_END))为基准,偏移offset(指针偏移量)个字节的位置。如果执行失败(比如offset超过文件自身大小),则不改变stream指向的位置。

    (1)stream:文件指针

    (2) offset:为偏移量,正数表示正向偏移,负数表示负向偏移

    (3) fromwhere:从文件的哪里开始偏移,可能取值为:SEEK_SET,SEEK_CUR、 SEEK_END (对应0 、 1 、 2)

    fseek(fp,100L,0); 把stream指针移动到离文件开头100字节处;
    
    fseek(fp,100L,1); 把stream指针移动到离文件当前位置100字节处;
    
    fseek(fp,-100L,2); 把stream指针退回到离文件结尾100字节处。

    关于fseek上文代码分析:

    if(s1.id == 77)  //通过查找id=77的位置来修改该结构体成员
    {
        s1.age=22;
        strcpy(s1.name,"yangni");
        fseek(fd,-sizeof(s1),SEEK_CUR); //设置偏移量
        fwrite(&s1,sizeof(s1),1,fd);
        break;
    }

    通过查找s1.id获得s1对象,此时光标锁定到了该对象数据末尾,因此修改完数据后。可设置向左偏移该结构体长度,将光标偏移到该结构体之前,再写入数据就可以覆盖之前的s1,就把s1内容给更改了。

    展开全文
  • c语言读写二进制文件

    千次阅读 2019-04-03 14:12:33
    1,写二进制文件: FILE *f_out= NULL;//声明文件句柄 f_out= fopen("c://aaa.txt","wb");//打开文件句柄 if(f_out == NULL) return; fwrite(dataArray,sizeof(unsigned char),count,f_out);//写数据,参数:...

    1,写二进制文件:

    FILE *f_out = NULL;//声明文件句柄

    f_out = fopen("c://aaa.txt","wb");//打开文件句柄

    if(f_out == NULL)

           return;

    fwrite(dataArray,sizeof(unsigned char),count,f_out);//写数据,参数:源数据,块大小,数据长度,文件句柄

    fclose(f_out);

    2 ,读二进制文件

    FILE *f_in = NULL;

    f_in = fopen("aaa.txt","rb");

    if(f_in == NULL)

         return;

    int actualCount = fread(dataArray,sizeof(unsigned char),length,f_in);

    fclose(f_in);

    备注:

    fseek(f_in, 0, SEEK_END);//将文件内部的指针指向文件末尾
    fileLength = ftell(f_in);//获取文件长度,(得到文件位置指针当前位置相对于文件首的偏移字节数)
    rewind(f_in);//将文件内部的指针重新指向一个流的开头

    展开全文
  • C语言读写二进制文件,文件的数据类型为float,废话少说,上代码:#include "opencv2/highgui/highgui.hpp"#include "opencv2/core/core.hpp"#include #include using namespace std;int main(){cv::Mat descr;...

    C语言中读写二进制文件,文件的数据类型为float,废话少说,上代码:

    #include "opencv2/highgui/highgui.hpp"

    #include "opencv2/core/core.hpp"

    #include

    #include

    using namespace std;

    int main()

    {

    cv::Mat descr;

    descr=cv::Mat::zeros(8,8,CV_32F);

    FILE *fp=fopen("file_text.txt","w");

    FILE *fp_bin=fopen("file_binary.bin","wb");

    float cout=0;

    for (int i=0; i

    {

    for (int j=0; j

    {

    cout+=1.0;

    fprintf(fp,"%f ",cout);

    descr.at(i,j)=cout;

    fwrite(&descr.at(i,j) , sizeof(float) , 1 , fp_bin);

    }

    fprintf(fp,"\n");

    }

    fclose(fp);

    fclose(fp_bin);

    FILE *fin_bin=fopen("file_binary.bin","rb");

    int rc;

    float buf;

    /*int k=1;*/

    while ((rc=fread( &buf, sizeof(float) , 1 , fin_bin))!=0)

    {

    std::cout<

    }

    fclose(fin_bin);

    return 0;

    }

    展开全文
  • //w会导致二进制文件写错误,遇到换行符0A会强制写成回车换行符0D0A c语言写文件: fwrite(buffer,buffersize,count,file);//分别是要写进文件的地址,写入内容大小,写入次数,被写文件 eg: int * ints[]={1,2,...

    c语言读取文件:

    FILE *f = fopen("filename","wb");//w会导致二进制文件写错误,遇到换行符0A会强制写成回车换行符0D0A

    c语言写文件:

    fwrite(buffer,buffersize,count,file);//分别是要写进文件的地址,写入内容大小,写入次数,被写文件

    eg:

    int * ints[]={1,2,3};

    fwrite(ints,sizeof(int)*3,1,f);

    展开全文
  • C语言读写二进制文件(float)

    千次阅读 2013-06-07 23:45:37
    C语言读写二进制文件,文件的数据类型为float,废话少说,上代码: #include "opencv2/highgui/highgui.hpp" #include "opencv2/core/core.hpp" #include #include using namespace std; int main() { cv::Mat ...
  • 查找了比较多的资源, 发现没有办法把text 文件转成binary文件仅作为记录,不过这个例子可以去除换行符。#include#include#defineN255intmain(){chara[N];FILE*fp1,*fp2;fp1=fopen("test_seq.fa","r");fp2=fopen(...
  • C语言实现二进制文件读写

    千次阅读 2019-01-29 16:31:51
    C语言实现二进制文件读写
  • 文章先介绍函数,我们一共要用到三个函数,fopen,fread,fwrite。二进制读写的顺序是用fopen以二进制方式打开读写文件,然后使用fread和fwrite两个函数将数据写入二进制文件中。
  • C语言读写二进制

    千次阅读 2015-10-26 21:09:54
    看了网上好多二进制文件读写,简单是简单,但是语焉不详,好多同学都在问度娘,赫夫曼编码如何存入二进制文件,鄙人通过潜心研究,总结诸多大侠的片言只语,终于通关,实现了这一功能。首先声明,本人只是在学习...
  • C语言读写二进制文件的使用
  • [转载] C语言实现二进制文件读写  转载于:https://blog.csdn.net/aresgod/article/details/1852321  我一直觉得二进制文件读写是个很容易的事,所以一直没在意,最近在写一个http客户端,实现文件下载的...
  • C语言二进制文件读写。在C语言中fread()、fwrite()函数中第2个第3个参数 代表了要读写的字节数和个数 。 写数组的两种方法:  int array[10];  1.fwrite(array,sizeof(array),1,pfile);  2.fwrite(array,...
  • 然后,就在网上搜索了一下,发现通过C语言实现二进制文件读写的资料居然出奇的少,这让我很愤怒,因为虽然这东西很简单,但是对于初学者,往往会需要花很长的时间去弄,一旦明白,又发现花的时间很不值得,罢了,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 33,087
精华内容 13,234
关键字:

c语言读写二进制文件

c语言 订阅