文件分类
- 程序文件:源程序文件(.c文件)、目标文件(.obj文件)、可执行文件(.exe文件)
- 数据文件:程序运行时读写的数据。
文件的打开和关闭
文件类型指针
文件在被打开时,都会在内存中开辟一个相应的文件信息区,用来存放被打开文件的相关信息(文件名、文件大小、文件位置等)。这些信息是保存在一个结构体中的,该结构体的声明就是FILE类型。
FILE *fptr; //文件指针 fptr = fopen("runoob.txt", "r")) //fopen打开一个文件,返回一个 FILE 指针 //fptr 现在就指向 runoob.txt文件的文件信息区。
文件的打开和关闭
- 在打开文件时,都会返回一个FILE* 的指针变量指向该文件,这样就建立了指针和文件的关系。
- 注意:打开文件后,必须关闭文件,并且将定义的文件指针赋值为NULL。
- ANSIC规定:使用 fopen 函数来打开文件,使用 fclose 函数来关闭文件
FILE *fopen(const char *filename, const char *mode) //打开文件函数
//filename:字符串,表示要打开的文件名称
//mode :字符串,表示文件的访问模式,
//返回值 :打开成功返回一个 FILE 指针。否则返回 NULL
int fclose(FILE *stream) //关闭文件函数
//如果成功关闭,则该方法返回零。如果失败,则返回 EOF。
- mode 文件访问模式可选的值:
文件的顺序读写
- fgetc :字符读取函数(适用于所有流)
- fputc :字符写入函数(写入单个字符)
- fgets :文本行读取函数(从文件中读取一整行数据)
- fputs :文本行写入函数
- fscanf :格式化读取函数(从文件中读取数据)
- fprintf :格式化写入函数(向文件中写入数据)
- fread :二进制读取(适用于文件)
- fwrite :二进制写入(适用于文件)
scanf/fscanf/sscanf和printf/fprintf/sprintf区别
- scanf :格式化的输入函数(输入就是读取,程序向控制台读取数据)
- printf :格式化的输出函数(输出就是写入,程序向控制台写入数据)
- fscanf :针对所有输入流的格式化输入函数
- fprintf :针对所有输出流的格式化输出函数
- sscanf :把一个字符串转换为格式化的数据
- sprinft :把一个格式化数据转换成字符串
指定文件的位置读写
fseek重定位指针
- 根据文件指针的位置(whence)和偏移量(offset)来重定位文件指针(stream)
int fseek(FILE *stream, long int offset, int whence)
- stream : 这是指向 FILE 对象的指针。
- offset : 这是相对 whence 的偏移量,以字节为单位。
whence : 指定文件指针的初始位置
- SEEK_SET :文件的开头
- SEEK_CUR :文件指针的当前位置
- SEEK_END :文件的末尾
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("file.txt","w+"); //创建一个用于写入的空文件
fputs("This is runoob.com", fp); //向文件中写入内容
fseek( fp, 7, SEEK_SET ); //重定位文件指针
fputs(" C Programming Langauge", fp); //向重定位后的位置写入数据
fclose(fp); //关闭文件
return(0);
}
//运行结果:This is C Programming Langauge
ftell查找当前文件指针位置
long int ftell(FILE *stream)
- stream :当前文件指针
- 返回值 :返回当前文件指针相当于文件起始位置的偏移量
rewind设置指针位置为文件起始位置
void rewind(FILE *stream)
- 函数作用:使文件指针stream指向文件的起始位置。
被错误使用的feof函数
- 这个函数不能用来判断文件是否读取结束。
- 而是用来在文件读取结束后,判断是哪种方式导致的文件读取结束(是文件读取失败还是文遇到文件结尾而结束的)
文件缓冲区
- 系统会自动在内存中为每一个正在使用的文件开辟一块文件缓冲区(是在内存中开辟的)
- 从程序向磁盘写入数据时,数据会先传输到缓冲区,当缓冲区填充满后,再一起传输到硬盘中。
- 从硬盘读取数据到程序时,数据也会先传输到缓冲区,当缓冲区填充满后,再一起传输到内存中。
- fclose在关闭文件时,也会将缓冲区剩余的数据放到硬盘中。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。