zoukankan      html  css  js  c++  java
  • C语言文件操作总结

    一、文本文件和二进制文件区别

    大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区别并不是物理上的,而是逻辑上的。这两者只是在编码层次上有差异。
    简单来说,

    • 文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICODE编码等等。
    • 二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么意思(这样一个过程,可以看作是自定义编码)。

    从上面可以看出文本文件基本上是定长编码的,基于字符嘛,每个字符在具体编码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。
    而二进制文件可看成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。

    C的文本读写和二进制读写
        应该说C的文本读写与二进制的读写是一个编程层次上的问题,与具体的操作系统有关,所以"用文本方式读写的文件一定是文本文件,用二进制读写的文件一定是二进制文件"这类观点是错误的.下面的讲述非明确指出操作系统类型,都暗指windows。

    C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.
    文本方式写时,每遇到一个'' ''(0AH换行符),它将其换成'' ''(0D0AH,回车换行),然后再写入文件;当文本读取时,它每遇到一个'' ''将其反变化为'' '',然后送到读缓冲区.
    二进制读写时,其不存在任何转换,直接将写缓冲区中数据写入文件.

    对于内容为 “Ab123 " (41 62 31 32 33 0D 0A)的文件,
    pf1 = fopen("f:\1.txt","r");或者pf1 = fopen("f:\1.txt","rb");
    for(int i=0;i <6;i++){
       fread(&a[i],1,1,pf1);
       printf("%0X ",a[i]);
    }
    fclose(pf1);//关闭文件

    的结果分别为:
    41 62 31 32 33 0A          和     41 62 31 32 33 0D 

    二、 C文件操作

    1. 文件指针

    FILE *fp;

      2. 函数

    fopen();

    如:fp = fopen("file_pathe_name", "r");

    参数1 : 文件名,

    参数2:打开方式 

    “r” (只读)为输入而打开一个文本文件 “w” (只写)为输出而打开一个文本文件 “a” (追加)向文本文件尾增加数据
    “rb” (只读)为输入而打开一个二进制文件 “wb” (只写)为输出而打开一个二进制文件

    “ab” (追加)向二进制文件尾增加数据
    “r+” (读写)为读/写打开一个文本文件 “w+” (读写)为读/写建立一个新的文本文件 “a+” (读写)为读/写打开一个文本文件 “rb+” (读写)为读/写打开一个二进制文件

    “wb+” (读写)为读/写建立一个新的二进制文件 “ab+” (读写)为读/写打开一个二进制文件 

     

    参数3:返回值,为指向该文件的指针

    打开文件出错时,返回NULL,在程序中可以利用这点来判断打开文件是否成功。

    FILE *fp;
    if((fp = open("file_name", "rb")) == NULL)
    {
        printf("Open file failed!
    ");  
    }

    fclose();

    fclose(fp);

    关闭成功返回0,失败返回非0。

    文件读写操作

    C语言提供了多种对文件读写的函数:
    字符读写函数:fgetc和fputc
    字符串读写函数:fgets和fputs 
    数据块读写函数:freed和fwrite 
    格式化读写函数:fscanf和fprintf
    • 使用以上函数须要包含头文件stdio.h

    判断是否读到文件末尾:

    EOF不是可输出字符,其值为 -1,当读入的字符值等于

    -1时,表示读入的已不是正 常的字符而是文件结束符 

    ch = fgetc(fp);
    while(ch != EOF)
    {
       putchar(ch);
       ch = fgetc(fp);
    }

    数据块的读写

    fread(buffer,size,count,fp );

    说明: buffer:指向存储数据空间的首地址的指针. size: 要读数据的字节数
    count: 要读多少个size字节的数据
    fp: 指向要进行读操作的文件

    fwrite( buffer,size,count,fp );

    说明: buffer:指向存储数据空间的首地址的指针. size: 要写数据的字节数
    count: 要写多少个size字节的数据
    fp: 指向要进行写操作的文件 

     

    格式化的读写 函数调用:

    fprintf ( 文件指针,格式字符串,输出表列);

    fscanf ( 文件指针,格式字符串,输入表列);

    函数功能:

       从磁盘文件中读入或输出字符
      例:
    

    fprintf( fp, ”%d,%6.2f”, i,t ); fscanf ( fp, ”%d,%f”, &i,&t ); 

    说明:

    1. a)  fscanf、fprintf函数与前面使用的scanf、printf函

      数的功能相似,都是格式化读写函数.

    2. b)  两者的区别在于 fscanf、fprintf函数的读写对象不

      是键盘和显示器,而是磁盘文件.

    3. c)  用fprintf、fscanf函数对磁盘文件读写,使用方便,

      但在输入、输出时需要进行类型转换,消耗较高资源.

    4. d)  在内存与磁盘频繁交换数据的情况下,最好不用 fprintf和fscanf函数,而用fread和fwrite函数. 

    文件的定位和随机读写

    rewind(fp);

    fseek();

    fseek函数(一般用于二进制文件)

    定义函数:

    int fseek(文件类型指针,位移量,起始点); 函数功能:

    移动文件流的读写位置.  说明:起始位置

    文件开头 SEEK_SET 0 文件当前位置 SEEK_CUR 1 文件末尾 SEEK_END 2 位移量:以起始点为基点,向前后移动的字节数. 一般要求为long型. 

  • 相关阅读:
    初识Mysql 连接器的收获(包含JDBC API最新文档)以及一些c++的有用技巧
    重拾 ”多项式“ 给我的启示
    vs2015下配置MySQL,使之能使用c++连接完美运行
    在CentOS上使用yum安装java
    CentOS 用yum安装中文输入法
    Redhat Linux RHEL5配置CentOS YUM更新源
    转:Linux下which、whereis、locate、find 命令的区别
    Centos 挂载NTFS格式的USB硬盘
    scp采用无密码在两台linux服务器之间传输数据
    转:Andriod studio技巧合集
  • 原文地址:https://www.cnblogs.com/wangjz/p/4738142.html
Copyright © 2011-2022 走看看