1.3文件操作
1.3.1打开文件
//头文件
#include <stdio.h>
打开
FILE *fopen(const char *pathname, const char *mode);
//功能 关联文件和流指针:内核去打开一个文件并产生一个流和它相关联 //返回值 成功: 返回与文件相关联的流指针, 失败:返回NULL,并设置错误码 //参数列表 pathname:要打开的文件路径及名字 //文件路径可以是绝对路径,也可以是相对路径;但不能用~(家目录) mode: 打开文件的方式(权限) "r" 以只读的方式打开文本文件,(流定位在文件开头) "r+" 以读写的方式打开文本文件,(流定位在文件开头) "w" 以只写的方式打开文本文件,文件不存在就创建,(文件存在就清空) "w+" 以读写的方式打开文本文件,文件不存在就创建,(文件存在就清空) "a" 以追加写的方式打开文本文件,文件不存在则创建,(文件存在则只能在末尾进行写入) "a+" 以追加写和可读的方式打开文本文件,文件不存在则创建,(文件存在则只能在末尾进行写入) // 当有b时,以二进制的方式打开文件:rd,r+b,wb,w+b(wb+),ab,a+b(ab+),
文件描述符产生文件流
FILE *fdopen(int fd, const char *mode);
//功能 通过一个文件的文件描述符产生一个指向与该文件相关联的流指针。 //返回值 成功: 返回文件的流指针, 失败: 返回NULL,并设置错误码 //参数列表 fd 文件的文件描述符 mode: 打开该文件的方式(权限)
重定向
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
//功能: 打开一个文件,用已经存在的流和这个文件进行绑定 //返回值: 成功: 返回文件的新流指针, 失败: 返回NULL,并设置错误码 //参数列表: pathname:要打开的文件路径及名字 mode: 打开文件的方式(权限) stream: 需要重新改变指向的流
1.3.2关闭文件
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
//功能 关闭文件流,并将与该文件流相关的缓冲区内容写入磁盘。 //返回值 成功: 返回0, 失败: 返回EOF,并设置错误码;(// EOF:宏定义,EOF == -1) //参数列表 stream: 需要关闭的流 /* 同一文件可以打开两次,但只能关闭一次 打开文件并不会去创建缓冲区,只有在真正读写的时候才会创建 流只是操作自己的缓冲区,并不是直接操作文件 */
1.3.3文件指针偏移
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
//功能: 改变文件内文件指针的定位 //返回值: 成功:返回0, 失败:返回-1 //参数列表: stream:要改变定位的流 offset:偏移量(字节),正数表示往后偏移,负数表示往前偏移 whence:文件指针初始点 SEEK_SET:文件头 SEEK_CUR:文件当前定位的位置 SEEK_END:文件尾
1.3.4读写文件
按字节读写文件
"读"
FILE *freopen(const char *pathname, const char *mode, FILE *stream);
//功能 从已经打开的流里面读一个字节的内容,读了字符过后指针会移动(读下一个字符) //返回值 成功:返回读到的字节内容(ASCII值) 到达文件结尾或失败: 返回EOf,并设置错误码 //参数列表 stream:要读取字符的输入流。
int getc(FILE *stream);
//功能 从指定的输入流中读取一个字符,并返回所读取的字符。 //返回值 成功: 则返回所读取的字符的ASCII值, 到达文件结尾或失败: 返回EOF,并设置错误码 //参数列表 stream:要读取字符的输入流。 int getchar(void); //功能 从标准输入流stdin中读取一个字符, //返回值 成功: 返回所读取的字符的ASCII值, 到达文件结尾或失败:返回 EOF,并设置错误码
int ungetc(int c, FILE *stream);
//功能 将一个无符号字符推回到给定的输入流中。(这意味着从流中读取的下一个字符将是c)。 //返回值 成功:返回将字符c转换为unsigned char的结果, 到达文件结尾或失败:返回EOF,并设置错误码 //参数列表 c: 要推回到流中的字符,(类型为int。通常是一个字符的ASCII值) stream:要操作的输入流。 "写"
int fputc(int c, FILE *stream);
//功能 从已经打开的流里面写一个字符,写入字符过后指针会移动 //返回值 成功:返回写入的字符(ASCII值) 失败: 返回EOf,并设置错误码 //参数列表 c: 要写入的字符(unsigned char 类型) stream:要写入字符的文件流。
int putc(int c, FILE *stream);
//功能 从已经打开的流里面写一个字符,写入字符过后指针会移动 //返回值 成功:返回写入的字符(ASCII值) 失败: 返回EOf,并设置错误码 //参数列表 c: 要写入的字符(unsigned char 类型) stream:要写入字符的文件流。 int putchar(int c); //功能 向标准输出流stdout中写入一个字符,并在后面追加一个换行符。 //返回值 成功: 返回所读取的字符的ASCII值, 到达文件结尾或失败:返回 EOF,并设置错误码
按行读写文件
"读"
char *fgets(char *s, int size, FILE *stream);
//功能 从流里面读取一行内容 //返回值 成功: 字符串存放的地址, 到达文件结尾或失败: 返回NULL,并设置错误码 //参数列表 s: 要存放字符串的缓冲区 size: 要读多少个字节 stream:要读的流 //注意: /* fgets最多读size-1个字节的内容, 如果读到了换行(\n),那么添加一个'\0'结束。如果size-1的位置还没有换行,那么直接添加'\0'结束 */
char *gets(char *s);
//功能 从标准输入中读取一串字符串 //返回值 成功: 字符串存放的地址, 到达文件结尾或失败: 返回NULL,并设置错误码 //参数列表 s: 要存放字符串的缓冲区 /* gets() 不检查输入的字符串长度,容易导致缓冲区溢出,替代函数是fgets() 函数。 */ "写"
int fputs(const char *s, FILE *stream);
//功能 往流里面写入一个字符串 //返回值 成功: 返回非负数 失败: 返回EOF,并设置错误码 //参数列表: s: 要写入的字符串所在的缓冲区 stream:要写的流
int puts(const char *s);
//功能 将字符串输出到标准输出流stdout, //返回值 成功:非负数, 失败:EOF,并设置错误码
按格式(对象)读写文件
"读"
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
//功能: 从流里面读n个对象的数据出来,每个对象占size个字节 //返回值: 成功: 返回实际读取到的对象数, 失败: 返回0,并设置错误码 //参数列表: ptr: 用于存放读取到的内容的缓冲区 size: 每个对象的大小 nmemb: 预计要读多少个对象 stream:要读的流 // size*nmemb 不准超过ptr的大小 "写"
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
//功能: 往流里面写入n个对象,每个对象size个字节 //返回值: 成功: 返回实际写入的对象数, 失败: 返回0,并设置错误码 //参数列表: ptr:存放要写入内容的缓冲区 size:每个对象的大小 nmemb:预计要写入的对象数 stream:要写的流