头文件:stdio.h
#include <stdio.h>
文件打开关闭函数
文件打开(fopen)
文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程序就可用此FILE指针来实现对指定文件的存取操作了。当使用打开函数时,必须给出文件名、文件操作方式(读、写或读写)。
FILE * fopen(const char * filename, const char * mode);
- 功能:打开文件
- 参数:
filename:需要打开的文件名,根据需要加上路径
mode:打开文件的权限设置
- 返回值:
成功:文件指针
失败:NULL
参数mode可选值
案例
检查fopen的返回值:
如何函数失败,它会返回一个NULL值。如果程序不检查错误,这个NULL指针就会传给后续的I/O函数。它们将对这个指针执行间接访问,并将失败
#include<stdio.h> #include<stdlib.h> #include<string.h> void test() { FILE *fp = NULL; // "\\"这样的路径形式,只能在windows使用 // "/"这样的路径形式,windows和linux平台下都可用,建议使用这种 // 路径可以是相对路径,也可是绝对路径 fp = fopen("../test", "w"); //fp = fopen("..\\test", "w"); if (fp == NULL) //返回空,说明打开失败 { //perror()是标准出错打印函数,能打印调用库函数出错原因 perror("open"); return; } } int main() { test(); return 0; }
文件关闭(fclose)
文件操作完成后,如果程序没有结束,必须要用fclose()函数进行关闭,这是因为对打开的文件进行写入时,若文件缓冲区的空间未被写入的内容填满,这些内容不会写到打开的文件中。只有对打开的文件进行关闭操作时,停留在文件缓冲区的内容才能写到该文件中去,从而使文件完整。再者一旦关闭了文件,该文件对应的FILE结构将被释放,从而使关闭的文件得到保护,因为这时对该文件的存取操作将不会进行。文件的关闭也意味着释放了该文件的缓冲区。
int fclose(FILE * stream);
- 功能:关闭先前fopen()打开的文件。此动作让缓冲区的数据写入文件中,并释放系统所提供的文件资源。
- 参数:
stream:文件指针
- 返回值:
成功:0
失败:-1
它表示该函数将关闭FILE指针对应的文件,并返回一个整数值。若成功地关闭了文件,则返回一个0值,否则返回一个非0值.
文件读写相关函数
总览
文件读写相关基本函数包括以下几个方面:
- 按照字符读写文件:fgetc(), fputc()
- 按照行读写文件:fputs(), fgets()
- 按照块读写文件:fread(), fwirte()
- 按照格式化读写文件:fprintf(), fscanf()
- 按照随机位置读写文件:fseek(), ftell(), rewind()
字符读写函数
int fputc(int ch, FILE * stream);
- 功能:将ch转换为unsigned char后写入stream指定的文件中
- 参数:
ch:需要写入文件的字符
stream:文件指针
- 返回值:
成功:成功写入文件的字符
失败:返回-1
int fgetc(FILE * stream);
- 功能:从stream指定的文件中读取一个字符
- 参数:
stream:文件指针
- 返回值:
成功:返回读取到的字符
失败:-1
int feof(FILE * stream);
- 功能:检测是否读取到了文件结尾
- 参数:
stream:文件指针
- 返回值:
非0值:已经到文件结尾
0:没有到文件结尾
字符读写案例
将把流指针fp指向的文件中的一个字符读出,并赋给ch,当执行fgetc()函数时,若当时文件指针指到文件尾,即遇到文件结束标志EOF(其对应值为-1),该函数返回一个 -1 给ch,在程序中常用检查该函数返回值是否为 -1 来判断是否已读到文件尾,从而决定是否继续。
#include<stdio.h> #include<stdlib.h> #include<string.h> void test() { //写文件 FILE* fp_write = NULL; //写方式打开文件 fp_write = fopen("./mydata.txt", "w+"); if (fp_write == NULL) { return; } char buf[] = "this is a test for pfutc!"; for (int i = 0; i < strlen(buf); i++) { fputc(buf[i], fp_write); } fclose(fp_write); //读文件 FILE* fp_read = NULL; fp_read = fopen("./mydata.txt", "r"); if (fp_read == NULL) { return; } #if 1 //判断文件结尾 注意:多输出一个空格 while (!feof(fp_read)) { printf("%c", fgetc(fp_read)); } #else char ch; while ((ch = fgetc(fp_read)) != EOF) { printf("%c", ch); } #endif } int main() { test(); return 0; }
输出结果为:
行读写函数
int fputs(const char * str, FILE * stream);
- 功能:将str所指定的字符串写入到stream指定的文件中, 字符串结束符 ‘\0’ 不写入文件。
- 参数:
str:字符串
stream:文件指针
- 返回值:
成功:0
失败:-1
char * fgets(char * str, int size, FILE * stream);
- 功能:从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符、读到文件结尾或是已读了size - 1个字符为止,最后会自动加上字符 ‘\0’ 作为字符串结束。
- 参数:
str:字符串
size:指定最大读取字符串的长度(size - 1)
stream:文件指针
- 返回值:
成功:成功读取的字符串
读到文件尾或出错: NULL


