1.打开流: FILE *fopen (const char *path, const char *mode);
成功时返回流指针;出错时返回NULL
示例 fopen(“test.txt”,“r+”);
path 文件路径
mode 打开方式
r: 可读、文件必须已经存在
r+: 可读、可写、文件必须已经存在
w: 可写、文件可以不存在、擦除文件以前的内容
w+: 可读、可写、文件可以不存在、擦除文件以前的内容
a: 可写、文件可以不存在、不擦除文件以前的内容,在末尾插入
a+: 可读、可写、文件可以不存在、不擦除文件以前的内容,在末尾插入
总结: 1、只有r或r+文件必须存在,因为是读的
2、+ 使文件可读可写
3、w擦除以前内容,a不擦除以前内容
2.关闭流: int fclose(FILE *stream);
成功返回0,失败返回EOF
3.读一个字符: int fgetc(FILE *stream)
返回所读取的一个字节。如果读到文件末尾或者读取出错时返回EOF
4.写一个字符 int fputc(int c, FILE *stream)
成功时返回写入的字符;出错时返回EOF
5.读一行: char *fgets(char *s, int size, FILE *stream)
成功时返回s,到文件末尾或出错时返回NULL
size 代表的是读取字符串的长度
遇到’\n’或已输入size-1个字符时返回,总是包含’\0’
6.写一行 int fputs(const char *s, FILE *stream)
成功时返回输出的字符个数;出错时返回EOF
s 代表要输出的字符串的首地址,可以是字符数组名或字符指针变量名
7.读若干个对象: size_t fread(void *ptr,size_t size,size_t n,FILE *stream);
成功返回实际读的对象个数,出错时返回EOF
示例: fread(s,sizeof(int),10,fp)
ptr 缓冲区首地址
size 每个对象所占的大小
n 一次读取的元素个数
stream 流指针
8.写若干个对象: size_t fwrite(const void *ptr,size_t,size_t n,FILE *stream);
成功返回实际写的对象个数,出错时返回EOF
示例 fwrite(s,sizeof(struct student),2,fp)
ptr 缓冲区首地址
size 每个对象所占的大小
n 一次写入的元素个数
stream 流指针
9.流的刷新: int fflush(FILE *stream);
成功时返回0;出错EOF
将缓冲区中的数据写入实际文件
linux下只能刷新输出缓冲区
10.获取当前流的位置: long ftell(FILE *stream);
成功时返回当前位置,错误EOF
11.定位流: long fseek(FILE *stream,long offset,int whence);
成功返回0,失败EOF
示例 fseek(fp, 0L, SEEK_END);
fseek(fp,100L,0);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,1);把fp指针移动到离文件当前位置100字节处;
fseek(fp,-100L,2);把fp指针退回到离文件结尾100字节处
stream 流指针
offset 偏移量,可正可负
whence 基准点 ,参数: SEEK_SET/SEEK_CUR/SEEK_END //开始/当前位置/末尾
SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2
12.以指定格式把字符串输入流中 int fprintf(FILE *stream,const char *fmt,…);
成功则返回输出的字节数,失败返回EOF
printf是打印输出到屏幕,fprintf是打印输出到文件。
示例 fprintf( stream, “%s%c”, s, c );
fprintf(fp,"%d-%d-%d\n",year,month,date);
stream 流指针
fmt 格式,一般用双引号包起来格式
… 变量,由格式决定数量