目录
- 标准IO的函数接口
1. 打开文件,关闭文件(fopen,fclose)
2.读/写一个字符(fgetc fputc)
3. 读/写一个字符串(fgets fputs)
4.读/写一个二进制文件(fread fwrite)
5. 移动指针(fseek)
fopen 打开文件
头文件
#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);
功能:打开一个文件
参数:参数:path:打开的文件的路径
mode:打开方式
r:只读,文件指针定位到文件开头(有文件)
r+:可读可写,文件指针定位到文件开头(有文件)
w:只写,文件不存在创建,存在清空,文件指针定位到文件开头
w+:可读可写,文件不存在创建,存在清空,文件指针定位到文件开头
a: 只写,文件不存在创建,存在追加(到文件末尾)
a+:可读可写,文件不存在创建,存在追加(到文件末尾)
读文件指针定位到文件开头。
返回值:成功返回文件流指针
失败返回NULL,并且设置错误码
示例代码
问:一个任务找中,最多打开多少个文件?一个文件能不能重复的被打开(可)
运行结果:
最多打开1021+3个文件(1024)
注意:打开文件的个数属于有限资源,所以用完这个文件后记得及时关闭。
fclose 关闭文件
int fclose(FILE *stream);
功能:关闭文件
参数:
stream:流指针
返回值:成功0,失败-1,更新errno
用法:fclose(fp);
perror
#include <stdio.h>
#include <errno.h>
void perror(const char *s);
功能:根据errno的值获取错误信息,将信息输出到终端
参数:s:提示信息
返回值:成功0,失败-1
fgetc 读一个字符
int fgetc(FILE *stream);
功能:从文件中读一个字符
参数:
stream:流指针(从那个文件读)
返回值:成功返回读到字符的ascii值,失败返回或读到文件结尾返回-1.
示例代码:
fputc 写单个字符
#include <stdio.h>
int fputc(int c, FILE *stream);
功能:向指定文件中写入一个字符
参数:c:要写入字符的ASCII值
stream:流指针
返回值:写入字符ASCII值
失败返回:EOF
练习:用fputc和fgetc实现cp功能,将文件A中的内容放到文件B中
fgets 获取字符串
char *fgets(char *s, int size, FILE *stream);
功能:从文件中获取指定长度的字符串
参数: s:字符串存放的首地址
size:期望获取字符的个数
实际读size-1个字符,会自动补'\0',预留一个位置补'\0'.
文件中不满size-1个,有多少读多少,都会补'\0'.
当读到'\n',结束,不再读下一行内容,再次调用fgets继续从下一行开始读。
stream:文件流指针
返回值:
成功:返回获取成功字符串存放的首地址
失败或读到文件结尾返回NULL。
示例代码
fputs 输入字符串
int fputs(const char *s, FILE *stream);
功能:向指定文件中输入一串字符
参数:
s:输入字符串的首地址
stream:文件流指针
返回值:成功返回输出字符个数
失败返回EOF
fprintf
#include<stdio.h>
int fprintf(FILE *stream, const char *format, ...);
功能:向指定的文件以指定的格式写入数据
参数: stream :流指针
format:指定格式
...:多个参数
返回值:输出字符个数
失败返回:EOF
用法:
fprintf(fp, "hello world\n");
练习:用fgets实现wc –l的功能,文件名从命令行输入
fread,fwrite
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以指定类型从文件中读取内容
参数: ptr:读内容存放的首地址
size:读一个元素内容的字节大小
nmemb:读元素的个数
stream:流(文件)
返回值:成功:元素个数,读到文件结尾0.
失败:-1
size_t fwrite(const void *ptr, size_t size, size_t nmemb,
FILE *stream);
功能:以指定类型向文件中写内容
参数:
ptr:写内容存放的首地址
size:写一个元素内容的字节大小
nmemb:写元素的个数
stream:流(文件)
返回值:成功:写元素个数.
失败:-1
示例代码:将一个int类型的数组写到文件中保存起来,并且读出来
文件指针偏移函数
rewind
void rewind(FILE *stream);
功能:将文件指针定位到文件开头
ftell
long ftell(FILE *stream);
功能:计算文件指针当前的位置(相对于文件开头)
返回值:成功:文件指针的位置
失败:-1,更新errno
fseek
int fseek(FILE *stream, long offset, int whence);
功能:将文件指针偏移到指定位置
参数:
stream:流指针
offset:偏移量 +5 --》相对于位置向后偏移5byte
-5 --》相对于位置向前偏移5byte
whence:相对位置
SEEK_SET:开头
SEEK_CUR:当前
SEEK_END:结尾
返回值:成功:0
失败:-1,更新errno
用法:
fseek(fp,+5,SEEK_SET)