文件相关

一、文件的基础 *文件基本概念 *文本文件与二进制文件的区别 *文件类型的数据结构 *文件基本操作

(1)文件的概念 文件:操作系统中的文件是指驻留在外部介质(如磁盘等)中的一个有序数据集。 各种类型的文件 程序文件:源文件、目标程序、可执行程序 数据文件(输入/输出): 文本文件、图像文件、声音文件、可执行文件等 文件的特点: 数据永久保存;数据长度不定;数据按顺序存取

(2)文本文件和二进制文件的区别 C语言中的文件是数据流(由一个个的字节数据组成) 文件的两种数据形式: ASCII码 (文本文件 text stream)字符流 二进制码(二进制文件 binary stream)二进制流 二进制文件是直接把内存数据以二进制形式保存。

缓冲文件系统
    由于磁盘速度慢,直接把数据写到磁盘效率很低
    故将数据存入缓冲器,在缓冲器中满512K之后再存入文件
向磁盘输出数据:
    数据  读入>> 缓冲区,装满缓冲区后 写入>> 磁盘文件。
    从磁盘读入数据:先一次性从磁盘文件将一批数据输入到缓冲区,然后再从缓冲区逐个读入数据到变量。
​
缓冲文件与文件类型指针:
    用文件指针指示文件缓冲区中具体读写的位置
    FILE   *fp;
    因此实际上文件指针是指向文件缓冲区的位置,而非文件所在位置。
    同时使用多个文件时,每个文件都有缓冲区,用不同的文件指针分别指示

(3)文件结构FILE与文件类型指针 FILE是一种自定义类型的结构体 FILE:结构类型, 用 typedef 定义(见stdio.h)

typedef struct{
    short                   level;          /* 缓冲区使用量  */
    unsigned        flags;          /* 文件状态标志 */
    char                    fd;             /* 文件描述符 */
    short                   bsize;          /* 缓冲区大小 */
    unsigned char       *buffer;    /* 文件缓冲区的首地址 */
    unsigned char   *curp;      /* 指向文件缓冲区的工作指针 */
    unsigned char       hold;           /* 其他信息 */
    unsigned            istemp;         
    short               token;          
} FILE;
文件类型指针
FILE * fp           如何使fp与具体文件挂钩?
指向文件缓冲区,通过移动指针实现对文件的操作
​
文件控制块FCB 
    文件控制块FCB(File Control Block) 
    操作系统中对文件的操作控制通过FCB,处理的是FCB列表
    一个文件对应一个FCB
    文件缓冲区由程序的fopen语句动态创建
    打开文件时, FCB的内容信息被复制到文件缓冲区保存
    用文件指针指向文件缓冲区实现对文件数据的访问
​
文件处理步骤四个步骤:
    ① 定义文件指针
    ② 打开文件:文件指针指向磁盘文件缓冲区
    ③ 文件处理:文件读写操作
    ④ 关闭文件
​
打开文件和关闭文件:
    if((fp=fopen("f12-2.txt","w")) == NULL){     
            printf("File open error!\n"); exit(0);
    }
    fopen("文件名","文件打开方式")
    使文件指针与相应文件实体对应起来
    程序对文件指针进行操作,即fp代表磁盘文件
    函数fopen() 的返回值
    执行成功,则返回包含文件缓冲区等信息的FILE型地址,赋给文件指针fp
    不成功,则返回一个NULL(空值)
    exit(0):关闭所有打开的文件,并终止程序的执行
    参数0表示程序正常结束;非0参数通常表示不正常的程序结束
    fp=fopen("f12-2.txt","w")
    文件打开方式参数表
        r : 只读模式,1)文件必须存在。2)读指针指向文件开始处 3)调用write()会报错
        w:  只写模式, 1)若文件不存在,创建文件。2)文件存在,清空文件。3)写指针指向文件开始处 。4)调用read()会报错
        a: 追加模式(只写)1)若文件不存在,创建文件 。2)文件存在,不清空文件,而是在文件的结尾处继续写入 3)写指针直线文件结尾处 4)调用read()会报错
        r+: 读写模式, 1)文件必须存在。2)打开可读写文件,读写指针均在文件头
        w+: 读写模式 ,1)若文件不存在,创建文件。 2)若文件存在是可读写文件,清空文件。3)读写指针均在文件头 
        a+:读写模式 , 1)若文件不存在,创建文件。2)文件存在,不清空文件。3)读指针在开始位置,写指针在文件结尾位置
    if( fclose(fp) ){
        printf( "Can not close the file!\n" );
        exit(0);
    }
​
    fclose(文件指针)
    把缓冲区中的数据写入磁盘扇区,确保写文件的正常完成
    释放文件缓冲区单元和FILE结构体,使文件指针与具体文件脱钩。
​
    函数fclose() 的返回值
    返回0:正常关闭文件
    返回非0:无法正常关闭文件
​
    文件读写函数
    字符读写函数: fgetc() / fputc()
    字符串读写函数:fputs() / fgets()
    格式化读写函数:fscanf() / fprintf()
    二进制读写函数:fread ()/ fwrite()
    其他相关函数:
    检测文件结尾函数feof()
    检测文件读写出错函数ferror()
    清除末尾标志和出错标志函数clearerr()
    文件定位的函数fseek() 、rewind() 、ftell()
​
其他相关函数
    函数feof()
    feof(fp) ;
    判断fp指针是否已经到文件末尾,
    函数返回值
    1:到文件结束位置
    0:文件未结束
​
    函数rewind( )
    rewind(FILE *fp);
    定位文件指针,使文件指针指向读写文件的首地址,即打开文件时文件指针所指向的位置。
​
    函数fseek( )——用来控制指针移动
    fseek(fp, offset, from);
    offset:移动偏移量,long型
    from:起始位置,文件首部、当前位置和文件尾部分别对应0,1,2,或常量SEEK_SET、SEEK_CUR、SEEK_END。
    例如:
    fseek(fp, 20L, 0):将文件位置指针移动到离文件首20字节处
    fseek(fp, -20L, SEEK_END):将文件位置指针移动到离文件尾部前20字节处
​
    函数ftell( )
    ftell(文件指针);
    获取当前文件指针的位置,即相对于文件开头的位移量(字节数)
    函数出错时,返回-1L
​
    ferror()函数:函数用来检查文件在用各种输入输出函数进行读写是否出错,若返回值为0,表示未出错,否则表示有错
    调用形式为:ferror(文件指针);
    文件指针必须是已经定义过的
​
    函数clearerr( )
    clearerr(文件指针);
    用来清除出错标志和文件结束标志,使它们为0

二、基本的二进制文件读写 2.1 二进制读写函数 2.2 举例:二进制文件的复制

2.1 二进制的数据块读写fread()和fwrite() fread(buffer, size, count, fp); 从二进制文件中读入一个数据块到内存缓冲区 fread的返回值为实际读入的对象个数 fwrite(buffer, size, count, fp); 向二进制文件中写入一个数据块 返回值为实际写入的对象个数 buffer:指针,表示存放数据的内存缓冲区首地址; size:数据对象的字节数 count:要读写的数据对象个数 fp:文件指针

命令行方式实现的二进制文件复制 命令行方式: int main(int argc, char *argv[]) FILE *infile, *outfile; 二进制读 :"rb" infile=fopen(argv[1], “rb”); //二进制打开读方式 二进制写:"wb" outfile=fopen(argv[2], “wb”);//二进制打开写方式

代码mcopy.c #include <stdio.h> #include <stdlib.h> #define MAXLEN 1024 int main(int argc, char *argv[]) {     FILE * outfile, *infile;     unsigned char buf[MAXLEN]; int rc;

    if (argc < 3 ){         printf(“usage: %s infile outfile\n”, argv[0]);         exit(1);     }     infile = fopen(argv[1], "rb");     outfile = fopen(argv[2], "wb" );     if( outfile == NULL || infile == NULL ){         printf(“Can not open file\n”);         exit(1);     }  while (rc = fread(buf, sizeof(unsigned char), MAXLEN, infile)){      fwrite( buf, sizeof( unsigned char ), rc, outfile ); } fclose(infile); fclose(outfile); return 0; }

命令名:mcopy 格式:mcopy file1 file2 mcopy a.c b.c mcopy a.jpg b.jpg

说明 fread和fwrite的参数完全一样。 在实际进行文件读写之前,应该先弄清文件数据的数据结构,这样就可以根据数据结构来设计与文件数据一致的结构体,一次性读入或写入数据。 而不需要每次从二进制文件中读写一小块儿数据,从而避免出错,同时也避免多次的循环读写,加快读写速度。

三、文件高级应用 3.1 位运算及信息加密 3.2 图形数据的二进制文件 3.3 图片二进制文件 3.4 音乐文件

3.1 位运算及信息加密 信息加密场景: 以二进制创建一个用户信息文件,包括用户ID和密码,密码以加密形式存储,加密算法:密码的字符串的ASCII码对应的二进制(8位)低4位按位取反,高4位与1异或。 位运算:运算的二进制位的形式

位运算的类型 位逻辑运算 ~ 按位取反 单目 右结合 & 按位与 ^ 按位异或:相同取0,不同取1 | 按位或 移位运算 << 对操作数左移给出的位数

对操作数右移给出的位数

注意区分: & 和 | && 和 || x=0 00000000 00000000 y=3 00000000 00000011 x && y得 0 x & y 00000000 00000000 x || y得 1 x | y 00000000 00000011 x ^ y 00000000 00000011 1010 ^ 0101 =1111

<< 对操作数左移给出的位数

对操作数右移给出的位数

x<<3 将x向左移3位,空出的位用零填补 00111010 << 3 11010000 x>>3 将x向右移3位 00111010 >> 3 10111010 >> 3 00000111 11110111

复合位赋值运算符 &= |= ^=

= <<= a &= b 相当于 a = a & b a <<= 2 相当于 a = a << 2

经典位运算问题

~x=?如~16 = -17 答案:-1-x, 因为:~x+x=全1,即-1. ~x^x=? 答案:全1, 因为:~x与x各对应位都相异 a^a  0 a^=b^=a^=b (a、b值互换)

右移1位,除以2,那么无穷多位 结果是? 答:左补符号位,负数:-1,正数:0 <<左移1位,乘以2,那么无穷多位,结果是? 答:(右补0)全0,得 0

信息加密 将输入的密码字符串,某些位按照位运算的方法进行运算后得到新的字符,得到新的字符串。 例:以二进制创建一个用户信息文件,包括用户ID和密码,密码以加密形式存储 加密算法:密码的字符串的ASCII码对应的二进制(8位)低4位按位取反,高4位与1异或。

3.2 图形数据的输出(二进制) 问题:基于libGraphics实现矢量图的绘制、输出和输入 基本图像的表示:点、线、面、图层等数据结构 实现点、线、面等几何图形的存储、读入 输入点线面数据到二进制文件

3.3 个人资金账户管理(二进制信息数据文件处理) 什么是顺序文件和随机文件 按照C程序对文件访问的特点来分,文件可分为顺序访问文件和随机访问文件,简称为顺序文件和随机文件。 顺序访问: 前面介绍的所有例子都进行的是顺序访问,通过使用fprintf()或fputs()函数创建的数据记录长度并不是完全一致的,这种记录长度不确定的文件访问称为顺序访问。 随机访问: 随机访问文件要求文件中单个记录的长度固定,可直接访问,这样速度快,并且无需通过其他记录查找特定记录。 因此随机文件适合银行系统、航空售票系统、销售点系统和其他需要快速访问特定数据的事务处理系统。

要求 个人资金账户的信息统一放在随机文件中,该随机文件包括的数据项有记录ID、发生日期、发生事件、发生金额(正+的表示收入,负-表示支出)和余额。 每记录一次收支,文件要增加一条记录,并计算一次余额。 程序实现3个功能,包括:1)可以创建该文件并添加新收入或支出信息; 2)可以显示所有记录列表,得知资金账户的收支流水帐; 3)查询最后一条记录,获知账户最后的余额。

cashbox.dat文件的部分内容 LogID CreateDate Note Charge Balance 1 2006-06-01 alimony 500.00 500.00 2 2006-06-08 shopping -300.00 200.00 3 2006-06-15 shopping -60.00 140.00 4 2006-06-20 workingpay 200.00 340.00 5 2006-08-01 scholarship 1000.00 1340.00

本章总结 文件的基本概念 文本文件和二进制文件 文件结构,文件指针,自定义类型 文件的打开与关闭、文件处理实现过程 文件读写二进制形式 文件读写操作与常用文件操作函数 文件高级应用 位运算&信息加密 矢量图形的表示 信息数据文件

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值