c语言文件读写:
需要用到stdio.h
(一)如何打开文件,创建文件,关闭文件,删除文件
FILE *fopen(const char *filename, const char *mode);
如果打开成功,返回对应文件的文件指针
如果打开失败,返回NULL指针
mode为访问文件的模式
filename为要打开的文件名字符串
"r" 打开文件,仅读 如果文件不存在,则打开失败
"w" 创建新文件仅写入 如果文件已存在,则清空后写入
"a" 打开文件附加写入 若不存在,则创建新文件写入
"a+" 文件读和附加写入 若存在,则可读和附加写入,若不存在,则创建文件
"r+" 文件读写 若文件不存在,则打开失败
"w+" 创建新文件读写 若存在,则清空后写入
使用int fclose(FILE *stream)关闭文件
若关闭成功,返回一个0值,否则返回一个非0值
采用 fcloseall()函数关闭程序中打开的多个文件
它将关闭所有在程序中打开的文件。 int fcloseall(); 该函数将关闭所有
已打开的文件,将各文件缓冲区未装满的内容写到相应的文件中去,接着释放
这些缓冲区,并返回关闭文件的数目。如关闭了4个文件,
则当执行: n=fcloseall(); 时,n应为4
int remove(const char *_Filename)用来删除文件。
成功返回0,失败返回-1
(二)如何获得文件读写的位置,如何判断是否读到了文件结束
使用feof(FILE *stream)来判断是否到了文件尾,若到了则返回非0值(返回的非0值为-1,通常与EOF(宏定义为-1的常量)比较),没到则
返回0
或者使用ferror()来判断是否出错,如果出错返回非0值。(用来判断之前的文件操作是否在文件中留下错误信息)
注意:在c语言里面,0被当做逻辑值false,非0值被当做逻辑值true
注意:EOF不一定都是1,依照系统有所不同
注意:feof()判断到了文件尾返回不一定是-1,不一定是EOF,还可能是16(笔者在vscode上测试,用的编译器是mingw64),为什么呢?
(三)文件读写
单个字符的读写:
使用int fgetc(FILE *stream),该函数会从文件指针指定的文件中读取一个
字符,然后返回该字符(或者说返回该字符对印的ascll码值),如果当时文件指
针指到文件尾,即遇到文件结束标志EOF(其对应值为-1),则该函数返回一个-1,
函数中常用检查该函数返回值是否为-1来判断是否已经读到了文件尾。
注意:fgetc用来读取单个字符的时候用char类型来装返回值,判断是否读到文
件尾的时候,却要用int类型来接收返回值,因为char类型无法用==来与EOF(
实际是-1)比较
用int fputc(int ch,FILE *Stream)来把ch写入文件,写入到指定文件指针
指向位置的后面。
注意事项:
特殊文件指针:stdin为标准输入流,stdout为标准输出(显示器)流
fputc(ch,stdout);语句会把ch写到控制台上。
在TC端,putchar(c)相当于fputc(c,stdout);getchar()相当于fgetc(stdin)
字符串的读写:
char *fgets(char *string,int n,FILE *stream)
它读取指定文件中n-1个字符,读到由指针string指定的字符数组中去,并且
在结尾加上'\0',fgets()函数执行完后,返回一个指向该串的指针;注意该函
数读到'\n'就停止,而不管是否达到数目要求。
如果执行成功,则返回一个指向该串的指针;如果读到文件尾或出错,则均返回
一个空指针NULL
char *gets(char *s)
该函数执行时,只要没有遇到换行符或者文件结束标志,就会一直读下去,因此
需要用户注意控制
int fputs(char *string,FILE *stream)
在指定文件写入一个由string指向的字符串,'\0'不写入文件。
int fprintf(FILE *stream,char *format,variable-list)
在指定文件按照指定格式写入指定字符串
int fscanf(FILE *stream,char *format,variable-list)
在指定文件按照指定格式读出指定内容