第十章 文件
文件就是一组相关元素或数据的有序集合,每个集合都有一个符号化的指代(文件名)
文件通常都被存在外部存储器上,它只在需要使用时被调入内存
一.相关概念:
1.主要分类
1). 普通文件:驻留在磁盘或其他外部介质上的一些有序数据集,
2).设备文件(逻辑上的文件): 和主机相连的各种外部设备:如显示器、打印机、键盘
2.流的概念
流就是表示文本输入(或输出)数据的字符代码的连续序列
在C语言中,“普通文件”就是一个字节流或二进制流。
3.流的工作原理
流在启动时,会自动创建3个标准文件指针
stdin:从操作系统向标准输入设备(通常为键盘)输入数据所构成的“标准输入流”;
stdout:从操作系统向输出设备(通常为屏幕)输出信息所构成的”标准输出流“
stderr:由屏幕显示报告出错信息构成的”标准报错流“
C语言还提供了:标准打印机和标准串行设备
小结:流是磁盘或其它外围设备中存储数据的源点或终点。
产生数据的叫做输入流;
消耗数据的叫做输出流;
4.处理文件的方法:
1)缓存文件系统(格式化系统)
2)非缓冲文件系统(非格式化系统)
5.文本文件和二进制文件
二、文件的基本操作
1、stdio.h中对FILE的结构体类型声明如下:
Typedef struct
{
short level; //记录打开文件流的缓冲区填入数据的情况
unsigned flags; //文件状态标志
char fd; //文件句柄,
unsigned char hold; //若无缓冲区,则不读取字符
short bsize; //文件缓冲区大小
unsigned char * buffer;//文件缓冲区指针
unsigned char *curp ;//当前激活的文件指针
unsigned istemp; //临时文件标识
short token; //用于有效性检查
}FILE;
2、文件的打开
fopen(filename,mode);
如:
FILE * pfile;
pfile = fopen("file1", "r") //建立pfile与文件“file1”的关联,即pfile指向file文件
pfile = fopen("d:\\file2.dat","rb"); //打开位于D盘根目录下的文件file2.dat
文件的关闭
3、fclose(pfile)
关闭一个当前打开的文件,fclose在关闭文件前线清楚文件缓存区,关闭成功则返回0,否则返回EOF(-1)
4、文件中的字符写
fputc(c,pfile);
fputc('a', pfile);//把字符写了pfile所指向的文件中
5、文件的字符读
fgetc(pfile);//指向一个已经打开的文件,返回值是一个读取出的字符
6. 文件中字符串读
char * str[3];
fgets(str, 3, pfile);//把pfile指向的文件中2个字符读到str字符串中(第三个是‘\0’)
7.文件中字符串写
fputs("abcd”, pfile);//把字符串“abcd”写入pfile所指的文件中
8.数据块的读写:
int fread(void * buffer,int size, int count, FILE * pfile)//buffer是指向数据内存区域的指针,size则表示简要进行读写的字节数,count代表要读/写多少个size字节的数据项
int fread(void * buffer,int size, int count, FILE * pfile)//从buffer指针指向的缓冲区中读取长度为count个size字节的数据项
三、文件缓存区的处理
int fflush( FILE *pfile )//清除由pfile指向的文件缓冲区里的内容。
int fflushall( void )//清除所有打开文件缓冲区里的内容。
void setbuf(FILE * pflie ,char * buffer);//把缓冲区域流相关联
第11章 动态数据结构
动态分配就是在程序的执行过程中动态地分配或者回收存储空间的分配内存的方法。
一、实现的方法
void * malloc(unsigned int size);//在内存的动态存储区中分配一个长度为size的连续空间。
void * realloc(void * p, unsigned int size);//该函数将p所指向内存区域大小给为size,size可以比原来分配的空间大或者小
void * free( void * p);//释放指针p所指向的内存区域
free()函数支付的是指针指向的内存,而不是指针。指针是个变量,只有程序结束时才被销毁。所以释放后内存后最好把指针指向NULL;
说明:
1)由于分配可能不成功,因此申请了内存空间后,必须检查是否分配成功。
2)malloc( )和free( )应该是配对的
3)虽然malloc( )的类型是void * ,任何类型的指针都可以转换为void * , 但是处于安全考虑,最好还是在前面进行牵制类型转换