文件操作前置知识:
1、文件可以分为两种类型:
①程序文件,这种文件的内容是程序代码。如源程序文件,目标文件,可执行文件等
②数据文件,其内容不是程序,而是供程序运行时读写的数据。
注:1.所谓“文件”一般指存储在外部介质(如磁盘)上数据的集合。
2.终端即计算机的各种输入输出设备。操作系统把终端都统一作为文件来处理。例如:终端键盘是输入文件,显示屏和打印机是输出文件。例如从终端键盘读入,然后在显示屏输出
2、一个文件要有唯一的文件标识(文件名),以便用户识别和引用。文件标识包括3部分:
①文件路径②文件名主干③文件后缀如:
E:\C程序设计\源程序\ helloworld.cpp
↓ ↓ ↓
文件路径 文件名主干 文件后缀
3、数据文件
4、文件缓冲区
5、文件类型指针
每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字,文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中。该结构体类型是由系统声明的,取名为FILE(在stdio.h中声明)
定义一个FILE类型的指针,然后使该指针指向某一个文件的文件信息区,那么我们就可以访问这个文件了
系统自定义了3个文件指针stdin,stdout,stderr分别指向标准输入流(键盘区的指针)、标准输出流(输出到屏幕的指针)、标准出错输出流(屏幕的指针)
6、常见的文件操作函数
①fopen函数:打开文件(打开是指为文件建立相应的信息区和文件缓冲区),fopen的调用方式为:fopen(文件名,文件使用方式); (fopen函数的返回值是一个FILE*类型的指针,即所创建的文件信息区的地址;如果打开失败会返回NULL)
如:FILE * fp = fopen(“a1”, “r”);
打开名字为“a1”的文件,使用文件方式“读入”(r代表read,即读入),其函数返回值是指向a1文件的指针fp(即a1文件信息区的开头地址),那么通过fp我们就可以访问这个文件。
②fclose函数:关闭数据文件(如果不关闭文件将会丢失缓冲区的数据),fclose的调用方式为:fclose(文件指针);(关闭文件指针所指向的文件;flose成功执行,返回0,否则返回EOF(EOF是宏名,值为-1))
③fgetc(fp)函数(也可写作getc):从fp指向的文件读入一个字符(一次只读一个,否则用while循环),读成功返回文件所读字符,读到文件末尾或者读取出错返回EOF.
④fputc(ch, fp)函数(也可写作putc):把单个字符ch写到文件指针变量fp所指向的文件中。输出成功返回值就是输出的字符,输出失败返回EOF(这个fputc可不是输出到屏幕上)
⑤文件读写检测函数:
ferror(fp);返回文件错误标志(代表文件读写时有没有出错)的值,返回值为0表示未出错,否则表示出错。
feof(fp);返回文件结束标志(代表对fp所指文件进行读写时,文件位置标记有没有到达文件末尾)的值,没有到达文件末尾,返回0,否则返回非0值(fgetc、fgets每读一次,文件位置标记都会随之移动!)
clearerr(fp);的作用是使fp所指向的文件的文件错误标志和文件结束标志置为0(也就是说使用clearerr(fp)之后,在调用ferror和feof函数,他们的返回值都为0).该函数没有返回值
文件读写检测函数的正确使用方式:
编写一个ce函数,每当对文件进行读写操作之后,就要使用ce函数检测一下有没有读写错误,如果有就把这个错误清除:
void ce(FILE * p)
{
if(ferror(p))
{
printf("文件读写出错\n");
clearerr(p);
}
}
又如:
while(!feof(p)) //如果没有到达文件末尾,就继续读取:此种做法可以把文件中的全部内容读进来输出到屏幕上,只不过末尾会多输出一个值为EOF的文件结束符
{
putchar(getc(p));
ce(p); //每次读取后就检查一下,并把错误清除
}
⑥fgets(str, n, fp)函数:一次最多从fp指向的文件读入(n-1)个字符,最后自动加’\0’存放到字符数组str中;如果在读完(n-1)个字符之前,读到’\n’或者文件结束符EOF,读入结束,将所读字符,加’\0’存放到字符数组str中(如果对该函数用while,表示一次读入(n-1)个字符直到读完)读成功返回地址str,如果一开始就遇到文件尾或读数据失败则返回NULL(留意一个点:如果要读入中文,那么fgets的参数n得要是偶数,否则会出现乱码,因为一个中文占两个字节)
⑦fputs(str, fp)函数:把str所指向的字符串写到文件指针变量fp指向的文件中(不包含’\0’),输出成功返回0,否则返回一个非零值。(str可以是字符串常量)
⑧fscanf(fp,格式化输入符,&形参列表)函数和fprintf(fp,格式化输出字符,形参列表)函数
printf和scanf函数是向终端进行格式化输出、从终端输入。如果向文件进行格式化输出、从文件输入,则需要用到fprintf和fscanf函数。与fgets和fputs相似,每读到’\n’或者文件结束符EOF就到下一个格式化输入输出符,没有即读入结束,调用方式如下:
fprintf(文件指针,格式字符串,输出列表);
fscanf(文件指针,格式字符串,输出列表);
注:输入时要将文件中的ASCII码转换成二进制形式保存在内存变量中,在输出时又要将内存中的二进制形式转换成字符,要花费较多的时间。比较节省时间的是fread和fwrite函数
⑨fread(buffer, size, count, fp)函数和fwrite(buffer,size, count, fp)函数;
都是4个参数!!!fread:从fp所指向的文件中读数据,最多读取count个项,每个项size个字节,并把这些数据存放到以buffer为地址开头的内存块中,返回成功读取的项数。fwrite从fp所指向的文件中读数据,最多读取count个项,每个项size个字节,并把这些数据存放到以buffer为地址开头的内存块中
(对二进制文件进行读写时用fread和fwrite函数,文本文件最好不要用这两个函数进行读写)
⑩rewind(fp)函数:使fp所指向的文件的文件标记到文件的开头位置,此函数没有返回值;fseek(文件类型指针,位移量,起始点)函数。fseek(p,0L,0)与rewind(p)等价:初始位置0,偏移0字节
(通过学习b站 织码匠 后重新整理)