目录
一.什么是文件
在程序设计中,我们⼀般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类 的)。
1.程序文件
程序文件包括 源程序文件(后缀为.c),目标文件(windows环境后缀为.obj,Linux环境下目标文件的后缀是.o),可执⾏程序(windows 环境后缀为.exe)。
2.数据文件
文件的内容不⼀定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的⽂件,或者输出内容的文件
3.文件名
⽂件名包含3部分:文件路径+文件名主干+文件后缀
文件名中有一些禁止使用的字符,如“<>?|”等
文件名中不一定包含后缀名,可以没有
文件的后缀名决定了一个文件的默认打开方式
文件路径指的是从盘符到该文件所经历的路径中各符号名的集合
例:C:\Program Files (x86)\Steam\streaming_client.exe
3.二进制文件与文本文件
根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。
二进制文件:数据在内存中以二进制的形式存储,不加转换的输出到外存就是二进制文件
文本文件:以ASCII字符的形式存储的文件。
通俗的讲:文本文件是可以读懂的,二进制文件没办法直接读懂
二. 文件的打开和关闭
1.流
为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。我们要想向流⾥写数据,或者从流中读取数据,都是要打开流,然后操作
2.文件指针
每个被使用的⽂件都在内存中开辟了⼀个相应的文件信息区,用来存放文件的相关信息(如文件的名 字,文件状态及文件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE,这就是文件指针。
不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与 它关联的文件。
这个指针是用来存放文件的首地址,专门用来指向文件的。
例:FILE * pf;
3 文件的打开和关闭
ANSIC 规定使用 fopen 函数来打开文件, fclose 来关闭文件。
fopen("要打开的文件名","打开方式");
fopen(“text.txt”,“r”);
打开方式:
r: 要打开文件之后要读文件(read) 文本文件 如果指定文件不存在 报错
w: 要打开文件之后要写文件(write) 覆盖 如果指定文件不存在 创建一个新的文件
a: 要打开文件之后要追加文件(append) 把新的数据加到末尾 如果指定文件不存在 创 建一个新的文件
rb: 要打开二进制文件进行读 如果指定文件不存在 报错
wb: 要打开二进制文件进行写 如果指定文件不存在 创建一个新的文件ab: 要打开二进制文件进行追加 把新的数据加到末尾 如果指定文件不存在 创建一个新的 文件
例:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//打开⽂件
FILE* pFile = fopen("test.txt", "w");
//判断是否成功建立
if (pFile == NULL)
{
perror("fopen");
return 0;
}
//文件操作
if (pFile != NULL)
{
fputs("fopen example", pFile);
}
//关闭⽂件
fclose(pFile);
return 0;
}
4.文件顺序读写
顺序读写函数介绍:
fgetc函数:
适⽤于 :所有输入流;
功能:从fp所指向的文件里面读取出一个字符。
格式:字符型变量=fget(fp); //fp是一个文件指针
文件一定要以读的方式打开,之后指针会自动向后移动一个位置
fputc函数:
适用于:所有输出流
功能:从fp所指向的文件里面写入一个字符。 (w)
格式:fputc(要写入的字符,fp);
文件一定要以写的方式打开,之后指针会自动向后移动一个位置
fgets函数:
适⽤于 :所有输入流;
功能:从fp所指向的文件里面读取出来一个字符串
格式:fgets(str,n,fp);它会读出n-1个字符,留一个字符为\0
str:存放字符串的一个数组,n表示读取出来字符的个数,fp是文件的指针
fputs函数
适用于:所有输出流
功能:把字符串写入到fp和指向的文件当中去
格式:fputs(str,fp);把str当中所有的字符写入到fp里面去
fscanf函数
适⽤于 :所有输入流;
功能:fscanf的用法与scanf函数类似,从文件中读取相应类型的数据,并将其存储到对应的变量中
格式:fscanf(FILE *stream, const char *format, …);
fprintf函数
适用于:所有输出流
功能:fprintf函数的工作方式与printf函数类似,不同之处在于fprintf将输出结果写入到文件中,而不是输出到屏幕上
格式:fprintf(FILE *stream, const char *format, ...);
专门用来对二进制文件进行操作的函数
fread函数:
适用:文件
功能:从fp所指向的文件当中读出一条信息,存放在一个结构体变量当中
格式:fread(&结构体变量名,sizeof(结构体类型),1,fp);
fwrite函数:
适用:文件
功能:把一个结构体变量当中的信息以二进制的形式写入到指定的文件当中去
格式:fwrite(&结构体变量名,sizeof(结构体类型),1,fp);
随机读写函数介绍:
fseek函数
功能:根据文件指针的位置和偏移量来定位文件指针。
例:
#include <stdio.h>
int main()
{
FILE* pFile;
pFile = fopen("example.txt", "wb");
fputs("This is an apple.", pFile);
fseek(pFile, 9, SEEK_SET);
fputs(" sam", pFile);
fclose(pFile);
return 0;
}
ftell函数
功能:返回文件指针相对于起始位置的偏移量
例
#include <stdio.h>
int main()
{
FILE* pFile;
long size;
pFile = fopen("myfile.txt", "rb");
if (pFile == NULL)
perror("Error opening file");
else
{
fseek(pFile, 0, SEEK_END);
size = ftell(pFile);
fclose(pFile);
printf("Size of myfile.txt: %ld bytes.\n", size);
}
return 0;
}
fwind函数
功能:让文件指针的位置回到文件的起始位置
feof函数
牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。
feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束
文本文件读取是否结束,判断返回值是否为 例如:
fgetc 判断是否为 EOF .( fgetc ),或者 NULL ( fgets )
fgets 判断返回值是否为 NULL . EOF
. ⼆进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
• fread判断返回值是否小于实际要读的个数。