文件(打开关闭读写) C语言
一、文件
二、打开文件 关闭文件
FILE *fopen(const char *path, const char *mode);
功能: 打开文件,获得对应的流指针数:
"r" 只读方式,文件必须存在,不存在则报错
"r+" 读写方式,文件必须存在,不存在则报错的空文件的空文件
"w" 只写方式,文件存在时,截短为 0 ,不存在,则创建 -->创建了一个新文件
"w+" 读写方式,文件存在时,截短为 0 ,不存在,则创建 -->创建了一个新文件
"a" 追加(写),文件存在时,从文件末尾开始写,文件不存在时,则新建一个文件
"a+" 追加(读写),文件存在时,从文件末尾开始写,文件不存在时,则新建一个文件
对二进制文件:
"rb" "rb+" "wb" "wb+" "ab" "ab+"
返回值:
成功 FILE 指针
失败 NULL
fclose(FILE *)
p.s.
当开始运行一个 C 程序时,系统将会负责自动打开三个文件: 标准输入 标准输出 标准出错
与之对应的指针分别为:stdin stdout stderr,
这三个指针都是常量通常情况下:
标准输入---一般与键盘连接
标准输出 标准出错-- 与终端屏幕连接
打开关闭文件:
三、读、写(文件的定位)
1、按字符读写
读:(从文件中读取一个字符)
int fgetc(FILE *stream);
功能: 从指定的流文件中获得字符参数:
@stream 指定的文件指针
返回值:
成功 返回 对应字符的 ascii值
失败 EOF (文件结束)error(错误) 都是-1
区分: eof 还是error
//检查对应文件的状态(eof error)
int feof(FILE *stream);//如果对应的文件数据到达文件结尾(eof),则该函数的返回值为非 0 值
int ferror(FILE *stream); //如果对应的文件数据出错,则该函数的返回值为非 0 值
读取单个字符:
循环读取单个字符到文件结尾:
另一种写法:
2、写:(往指定文件中写入一个字符)
int fputc(@c,FILE *stream);
功能:
实现字符输出参数:
@c 要输入的字符
@stream 指定的输入文件对应的文件指针
返回值:
成功 写入的字符对应的 ascii 码
失败 EOF
写入单个字符:
3、按行读写,按字符串进行读写
读:(从文件中读取一行字符串)
char *fgets(char *s, int size, FILE *stream);
功能: 获取字符(串) 参数:
@s 自己开辟的一块内存空间的首地址(用来保存获取到数据)
@size 一次 fgets 操作期望读取到的最大字符个数
@stream 指定的输入文件的文件指针返回
返回值:
成功 s
失败 NULL
文件结尾 NULL
读取结束:
(1) EOF
(2) '\n'
(3) size
对 '\n' 的处理:fgets 会将 '\n' 保存到 buffer 中去
buffer:缓冲器
每次读取结束 最后都会添加一个 '\0' ,保证是一个字符串
fgets 一次最多能读取 size - 1 个字符
读取一行字符串:
写:
int fputs(const char *s, FILE *stream); // 将 s 指定的字符串输出到 stream 指定的文
件中
fputs 不会将'\0'进行输出,遇到'\0'就输出
4、按对象读写(二进制的读写)
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
对象: --> 可以指定按什么数据类型进行操作(int char short 结构体等)
参数:
@ptr 保存数据的
@size 单个对象的大小 sizeof(对象类型)
@nmemb 一次期望操作的对象个数
@stream 要操作的流文件
返回值:
成功 返回值 成功操作的 对象个数
失败 0
注意:
一次操作的字节数 = 成功操作的对象个数 * 单个对象的大小
如果想完整的读取到文件的内容,文件中没有固定的数据格式时, 最好按 char 来读。
读写一组数据:
四、文件定位:
int fseek(FILE *stream, long offset, int whence);
功能: 设置 offset 的值,实现定位
参数:
@stream 要定位的文件指针
@offset 偏移值
@whence 相对的偏移起点
SEEK_SET 从文件开头偏移(0) offset >= 0
SEEK_CUR 当前位置(1) offset 可正可负
SEEK_END 文件结尾(2) offset 可正可负
返回值:
成功 0
失败 -1 &error 置位
eg:
//从文件开头偏移 100 个字节
fseek(fp,100,SEEK_SET);
//从当前位置 往后偏移 100 字节
fseek(fp,100,SEEK_CUR);
//从当前位置 往前偏移 100 字节
fseek(fp,-100,SEEK_CUR);
//从文件尾部位置 往后偏移100 字节------- >相当于在源文件的基础上又扩充了100 个字节
fseek(fp,100,SEEK_END);
重定位:大小可以通过计算获得