zoukankan      html  css  js  c++  java
  • 学习笔记2

    # c语言中对二进制文件的操作函数

    ### 1、fopen 的用法

    FILE * fopen(char *filename, char *mode);

    函数参数:

    1.filename:文件名,包括路径,如果不显式含有路径,则表示当前路径。例如,“D:\f1.txt”表示 D 盘根目录下的文件 f1.txt 文件。“f2.doc”表示当前目录下的文件 f2.doc。

    2.mode:文件打开模式,指出对该文件可进行的操作。


      r      只读     文件必须存在,否则打开失败                           
      w    只写     若文件存在,则清除原文件内容后写入;否则,新建文件后写入            
      a     追加只写  若文件存在,则位置指针移到文件末尾,在文件尾部追加写人,故该方式不 删除原        文件数据;若文件不存在,则打开失败
      r     读写    文件必须存在。在只读 r 的基础上加 '+' 表示增加可写的功能。下同     
      w    读写     新建一个文件,先向该文件中写人数据,然后可从该文件中读取数据          
      a    读写     在” a”模式的基础上,增加可读功能                      
      rb    二进制读  功能同模式”r”,区别:b表示以二进制模式打开。下同              
      wb   二进制写   功能同模式“w”。二进制模式                          
      ab    二进制追加 功能同模式”a”。二进制模式                          
      rb  二进制读写 功能同模式"r+”。二进制模式                         
      wb    二进制读写 功能同模式”w+”。二进制模式                         
      ab  二进制读写 功能同模式”a+”。二进制模式                         

    ## 2、判断文件是否结束

    方法一:使用feof(文件指针)函数,用来判断文件是否结束  //文本文件和二进制文件都可用。

    返回值为1,文件结束;

    返回值为0,文件没有结束。

    方法二:判断EOF(-1)标志 //仅适用于文本文件

    因为文本文件中,数据是以ASCII码值形式存放的,而ASCII码值的范围是0-255,不会等于-1.

    ## 3、读写二进制文件函数



    ### 1)fread

    fread(buffer,size,count,fp)

    buffer:指针,表示内存中存储空间的首地址;

    count:要读写的单元数

    size:每单元的字节数

    fp:文件指针。

    从fp所指的文件中读count个单元,每个单元size个字节,到以buffer为起始地址的内存中

    例如:

    **int a[2];**

    **fread(a,4,2,fp);**

    ### 2)fwrite

    fwrite(buffer,size,count,fp)

    buffer:指针,表示内存中存储空间的首地址;

    count:要读写的单元数

    size:每单元的字节数

    fp:文件指针。

    将以buffer为起始地址内存中的count个单元,每个单元size个字节写到fp所指的文件中。

    例如:

    **int a[2]={1,2};**

    **fwrite(a,4,2,fp); 将以a为起始地址的内存中的2个单元,每单元4个字节,写到fp所指的文件中。**

    ## 4、文件定位函数

    顺序存储的时候,对文件读写操作是从文件的开始位置进行的,

    随机存取文件可以从从文件的任意位置进行操作的。

    fopen的时候,文件位置指针指向文件的开头,第一个数据之前;

    文件结束后,文件位置指针指向文件的结尾,最后一个数据之后。

    对数据进行读操作,文件位置指针指向尚未读数据之前;

    对数据进行写操作,文件位置指针指向刚写入的数据之后。

    ### 1)fseek(fp,offset,origin); 一般用于二进制文件,因为文本文件会发生字符转换,计算位置会发生混乱。

    offset为以origin为几点,以字节为单位的偏移量;当offset为正整数,表示位置指针从指定的起始点向后移动,当offset为负整数的时候,表示位置指针从指定的起始点向前移动。

    ![image-20210918165134690](C:UsersKYboiAppDataRoamingTypora ypora-user-imagesimage-20210918165134690.png)

    返回到文件开头位置:

    fseek(fp,0L,SEEK_SET);   //文件第一个数据之前?(指向文件第一数据)

    返回到文件末尾位置:

    fseek(fp,0L,SEEK_END);  //文件最后一个数据之后

    ### 2)ftell函数

    获得文件当前位置指针的位置,并返回当前位置指针相对于文件开头的字节数。

    ftell(文件指针)

    例如:

    计算文件的中总的字节数

    fseek(fp,0L,SEEK_END);

    long   size = ftell(fp);

    ### 3)rewind函数

    rewind(fp);

    使文件指针返回到文件开头位置。

    等价于fseek(fp,0L,SEEK_SET);



    #### 补充:

    C 程序与文件的访问中,经常涉及换行操作。二进制文件与文本文件在换行规则上略有差别。

    在 UNIX 和 Linux 系统中,无论是二进制文件还是文本文件,均是以单字节 LF(0x0A) 即作为文件中的换行符。

    由于 C 语言是在 UNIX 系统上提出并发展起来的,故 C 语言中的换行规则与 UNIX 系统文件中的换行规则是一致的,使用 LF 即 ' ' 表示换行。因此 C 语言程序访问 UNIX/Linux 系统中的文件时,可直接访问,不需要转换。

    而在 DOS/Windows 系统中,文本文件使用 ASCII 值为 13(0x0D) 的回车符 CR(Carriage-Return) 以及 ASCII 值为 10(0x0A) 的换行符 LF(Line-Feed) 这两个符号,即双字节 CR-LF(0x0D 0x0A) 的 'r'、' ' 作为文本文件的换行符。与 C 语言程序中的换行符不一致。

    因此,若使用 C 语言程序访问 DOS/Windows 系统中的文本文件,针对换行符的差异,就必须多一层转换。如果把 C 程序中数据以文本的方式写入文件时,需要把 C 程序中的 ' ' 转换为 'r' 和 ' ' 这两个字符后,再写入文本文件;当 C 程序以文本方式读取文本文件中的数据时,需要把文本文件中连续出现的两个字符 'r'、' ' 转换为一个字符 ' ' 后,送给 C 程序。

    说明:DOS/Windows 系统的文本文件中,回车 ' ' 和换行 ' ' 的含义如下:

    - 回车' ':表示光标回到该行的行首处。
    - 换行' ':表示光标从当前行该列位置移动到下一行对应的该列位置。



    二进制文件和文本文件如何转换:https://blog.csdn.net/C_address/article/details/49767545

    数据结构如何读写:https://blog.csdn.net/weixin_34258078/article/details/93605068
  • 相关阅读:
    [转]百度地图API详解之地图坐标系统
    [转]MBTiles 离线地图演示
    [shell 编程] if [ $# -eq 0 ]该语句是什么含义?
    [shell编程] sh脚本异常:/bin/sh^M:bad interpreter: No such file or directory
    [Android Studio] Android studio 多渠道打包(超简洁版)
    [Android Pro] Android中全局Application的onCreate多次调用问题
    [Java基础] Java如何实现条件编译
    [Git] 根据commiter过滤该用户的所有提交
    [Android Pro] Notification的使用
    [Git] Git把Tag推送到远程仓库
  • 原文地址:https://www.cnblogs.com/2902480848sy/p/15325497.html
Copyright © 2011-2022 走看看