fopen函数 ---
打开一个文件流
函数原型:
FILE* fopen(const char *path, const char *mode);
参数:参数path是需要打开文件的文件名,通常把它叫做文件的路径,
参数 mode 是打开文件的权限(只读、只写、读写等)。
返回值:打开成功返回指向打开文件的指针,后序可以通过这个指针来访问该文件。
打开失败则返回NULL。
关于第三个参数----文件打开的方式有如下几个选项
r 只读的方式打开
r+ 以读写的方式打开,读写都从文件开头开始(并不会清空文件里边原有的内容)
w 只写的方式打开,先清空,再重头写
w+ 以读写的文件打开,如果该文件不存在就创建,如果存在,读写从文件开头开始,写之前要先清空文件里边原有的内容。
a 如果文件不存在就创建,用于追加写入
a+ 用于追加读/写
举个简单的例子。
#include <stdio.h> int main() { const char* path = "./test.txt"; FILE* fp = fopen(path,"w"); if(fp == NULL) printf("opem failed %s\n",path); //文件打开失败时把文件路径打出来,方便我们去该路径查看该文件是否存在 return 0; }
fgetc/fputc函数 ---
读取/写入一个字节
函数原型:
int fgetc(FILE *stream);
参数:打开的文件流,即fopen函数的返回值。
返回值:返回所读取的一个字节。
如果读到文件末尾或者读取出错时返回EOF。
说明:
很多人认为这俩函数就是读取一个字符的,然后就用char类型的变量来接收该函数的返回值,但是这样是有问题的。
下边举个例子。
#include <stdio.h> #include <stdlib.h> int main() { FILE* fd = fopen("test.txt","r"); if(NULL == fd)//文件打开失败 { perror("fopen"); exit(EXIT_FAILURE); } char ch;//错误示范 int ch;//正确示范 while((ch = fgetc(fd))!= EOF)//一直读,知道文件结束 { putchar(ch); } return 0; }
当将char类型与int类型做比较时,会有一个整型提升,0xFF将会被提升为0xFFFFFFFF,与EOF的值相等,从而导致文件读取提前结束(而事实上文件并没有读完)。
所以,
一定要使用int类型的变量来接收fgetc函数的返回值
fgets/fputs函数 ---
读取/写入一个字符串
函数原型:
char *fgets(char *str, int size, FILE *stream);
参数:参数str,存储着需要写入的字符串/用于存储读出来的数据
参数size是读取或者写入的字符创的长度。
参数stream是打开的文件流,fopen函数的返回值。
返回值:调用成功,将读取的字符串返回,使用fgets函数读取的时候会自动在字符串后边加上一个‘\0’,失败返回NULL。
fread函数 ---从文件流中读取
一段数据
函数原型
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:参数ptr用于存放读取的内容。由于读取的内容的类型不固定(可叫做读取记录吧)有可能是一个字符,整型或者结构体,所以是void* 类型的。
参数size 是读取记录的大小。
参数nmemb是读取记录的条数。
stream是文件流,fopen函数的返回值。
返回值:
返回的是成功读取到的字节数。
有时候我们期望读到很多数据,然后文件流里边又没有那么多数据,该函数会将我们已经读取到的数据的字节数返回。所以,返回值有时候并不等于我们期望读的数据的长度。
fwrite函数
---向文件里边写数据
函数原型:
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
参数:参数ptr是想要写入到文件流里边去的内容。
参数size是将要写入元素的大小。
参数nmemb是将要写入元素的个数。
参数stream是将要写入的地方。
返回值:返回成功写入数据的字节数。
fprintf函数
---将格式化的数据写入文件
函数原型:
int fprintf(FILE *stream, const char *format, ...);
参数:参数stream是文件指针
参数format格式化字符串
后边跟输出列表
返回值:本次写入操作写到文件中的字节数。
使用:fprintf(fp, "%d",buffer);
fprintf与printf的不同之处在于printf是写入到标准输出(屏幕),而fprintf是将数据写入到指定的文件中去。
fscanf函数 ---格式化的数据读出到变量
函数原型:
int fscanf(FILE *stream, const char *format, ...);
参数:参数stream是文件指针
参数format格式化字符串
后边跟将要被赋值的变量
返回值:本次成功获取数据的字节数。
fscanf与scanf函数的区别在于scanf是从标准输入(键盘)读取数据,而fscanf是从指定的文件中读取数据。
fseek函数 ---控制文件指针偏移
函数原型:int fseek(FILE *stream, long offset, int whence);
参数:参数stream是文件指针。
offset是偏移量。
whence是指偏移方式。有如下三种值可选:
SEEK_SET 从距文件开头offset 位移量为新的读写位置.
SEEK_CUR 以目前的读写位置往后增加offset 个位移量.
SEEK_END 将读写位置指向文件尾后再增加offset 个位移量.
说明:
当whence 值为SEEK_CUR 或
SEEK_END 时, 参数offset 允许负值的出现.
给出两种比较特别的使用方式
1)、将文件指针移动到开头:fseek(fd, 0, SEEK_SET);
2)、将文件指针移动到结尾:fseek(fd, 0, SEEK_END);
返回值:调用成功返回0,失败返回-1,errno会存放错误代码。
ftell函数 ---获取当前文件指针的位置
函数原型
:long ftell(FILE *stream);
返回值:文件指针相对于文件开头的偏移量。
rewind函数 ---将文件指针指向文件的开头
函数原型:
void rewind(FILE *stream);
feof函数 ---判断文件指针是否指向文件结尾
函数原型:int feof(FILE *stream);
返回值:如果已经到达文件的结尾(已经将文件的最后一个字符都读走了),返回0,否则返回非0数字。
EOF(end of file的简写)是文本文件结束的标志。在文本文件中,数据已字符的ASCⅡ码值的形式存放,普通字符的ASCⅡ码的范围是32到127(十进制),EOF的16进制代码为0XFF(十进制为-1),因此可以用EOF作为文件的结束标识。当把数据以二进制的形式存放到文件中时,就有可能会将数字-1存放到文件中,此时继续根据EOF来判断文件是否结束就会出问题,为了解决这个问题,ASCI C 就提供了feof 函数。
打开一个文件后没有使用flose关闭 会导致文件句柄泄漏或者可以统称为资源泄漏。
使用函数fclose(FILE* stream)关闭打开的文件
r 只读的方式打开
r+ 以读写的方式打开,读写都从文件开头开始(并不会清空文件里边原有的内容)
w 只写的方式打开,先清空,再重头写
w+ 以读写的文件打开,如果该文件不存在就创建,如果存在,读写从文件开头开始,写之前要先清空文件里边原有的内容。
a 如果文件不存在就创建,用于追加写入
a+ 用于追加读/写