文件
程序文件:包括源程序文件(后缀为.c)、目标文件(后缀为.obj)、可执行文件(后缀为.exe)等。这种文件内容是程序代码
数据文件:内容是供程序运行时读写的数据,如在程序运行过程中输出到磁盘(或其他外部设备)的数据,或在程序运行过程中供读入的数据。(本章主要)
磁盘文件:将一些数据输出到磁盘上保存起来,以后需要时再从磁盘中输入到计算机内存
数据流:数据传送的过程
文件名
doc-Word生成的文件
txt-文本文件
dat-数据文件(写程序能用的)
for-FORTRAN语言源程序文件
obj-目标文件
exe-可执行文件
bmp-图形文件
数据文件分类
数据在内存中以二进制形式存储,不加转换地输出到外存,就是二进制文件,可以认为它就是存储在内存的数据的映像,也称为映像文件。
在外存上以ASCII代码形式存储,则需要在存储前进行转换。又称为文本文件
ASCII码形式一般占用存储空间较多,而且要花费转换时间(二进制形式与ASCII码间的转换)
文件缓冲区
缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区
文件类型的指针
FILE* fp;(也可以FILE f1,但一般通过文件指针引用文件)
打开与关闭文件
文件所在位置
"D:\\CC\\string.dat"(因为c语言默认把'\'当成转义字符,所以要写2个)
如果在fopen中的文件名处,未填写具体位置,则默认跟程序源文件同目录下
fopen(文件名,使用文件方式)
fopen("学生信息管理.dat","r")(都要"",文件名带后缀)
使用文件方式——如下:
w方式——如果之前已存在一个以该文件名命名的文件,则在打开文件前先将该文件删去,然后重新建立一个新文件
fopen无法实现“打开”时,返回NULL
带b和不带b只有一个区别,即对换行的处理。由于在C语言用一个'\n'即可实现换行,而在Windows系统中为实现换行必须要用“回车”和“换行”两个字符,即'\r'和'\n'。所以,遇到文本文件并且用w方式打开,在向文件输出时,遇到换行符'\n'时,系统就把它转换为'\r'和'\n'两个字符。同样,用r方式打开,从文件读入,遇到'\r'和'\n'两个连续的字符,就把它们转换为'\n'一个字符。
而二进制文件,在读写时,不需要这种转换。
标准输入流是从终端的输入
标准输出流是向终端的输出
标准出错输出流是当程序出错时将出错信息发送到终端
fclose(文件指针)
如果不关闭文件就结束程序运行将会丢失数据
用了一个fopen时就对应用一个fclose保存
exit(0)
退出文件操作,回到终端
在<stblib.h>头文件
向文件读写数据
文件读取指针
就是在文件中读取数据的位置的指针,指向数据的具体内容的(每用一次读取,指针都会偏移)
也称文件读写位置标记
文本文件
fgetc(fp)——从文件中读取一个字符
fputc(ch,fp)——将ch字符写到文件中(两个失败时都是返回EOF)
fgets(str,n,fp)——从文件中读取字符串(长度为n-1。因为要在str后补一个'\0')(遇到'\n'结束并且将'\n'读入)
fputs(str,fp)——将字符串str输入到文件
fprintf(fp,"%d",i);(基本类似于printf)
fscanf(fp,"%d",&i)(基本类似于scanf)
但fprintf和fscanf要将进行二进制转换(fgets和fputs好像也要吧,书上只说了fprintf和fscanf)
文件结束标记EOF
feof(fp)表示是否读到文件的EOF(这个函数其实问题挺多的,以后想写的时候再补充)
二进制文件方式向文件读写一组数据
fread(&stud[i],sizeof(struct Student_type),1,fp)(读取fp文件中为struct Student_type数据长度的1个数据读入到stud[i]内)
fwrite(&stud[i],sizeof(struct Student_type),1,fp)(将stud[i]内的数据长度为struct Student_type的1个数据写到fp所指向的文件)
getw,putw(书上没讲,只是提及了一下)
记住fopen的使用文件方式一定要带b
随机读写数据文件
rewind——使函数位置标记指向文件开头
fseek(文件类型指针,位移量,起始点)
fseek(fp,100L,0)——将文件位置标记向前移到离文件开头100个字节处(书上的原话是这个,但实际上按我的理解应该是向后移。就比如"1,2,3",2在1的后面)
fseek(fp,50L,1)——将文件位置标记向前移到离当前位置50个字节处
fseek(fp,-10L,2)——将文件位置标记从文件末尾向后退10个字节(同上,按我的理解应该是前移)
位移量应是long型数据(在数字的末尾加一个字母L,就表示是long型)
ftell
得到流式文件中文件位置标记的当前位置(用相对于文件开头的位移量来表示)
出错返回值为-1
其它
ferror(fp)——返回0表示未出错,非0值表示出错
clearerr——出现文件读写出错标志,它就一直保留。直到对同一文件调用clearerr函数或rewind函数