标准I/O
标准I/O通过文件流指针(FILE *stream)来操作文件。
文件流:file stream/stdio stream
标准I/O提供了三种特殊的文件流,即;
stdin:标准输入流(终端输入)
stdout(终端输出)
strerr标准错误
标准I/O因为有缓冲机制,减少了系统调用的次数,进而缩小了系统开销。
标准I/O函数
fopen
打开一个文件,获取文件的文件流指针。
#include<stdio.h>
FILE *fopen(const char *pathname, const char *mode);
pathname即带路径的文件名,mode则是打开方式。
整个函数赋给文件流指针
mode
mode | 含义 | 读写指针的位置 |
---|---|---|
r | 只读 | 读指针在文件开头 |
r+ | 可读可写 | 读写指针在文件开头 |
w | 只写,会截断文件,让文件长度为0,文件不存在则创建 | 写指针在文件开头 |
w+ | 可读可写会截断文件,文件不存在则创建 | 读写指针在文件开头 |
a | 追加,问价不存在则创建 | 写指针在文件末尾 |
a+ | 可读可追加,文件不存在则创建 | 读指针在文件开头,写指针在文件末尾 |
另外模式字母可以与“b”组合使用,表示以二进制形式操作文件。
fclose
用于关闭文件流,并刷新缓冲区。
#include <stdio.h>
int fclose(FILE *stream);
返回之成功为0,失败则为-1或者错误码。
fread
用于将文件数据读取到缓存中。
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr存储读取来的数据的首地址。
size每一个都单元的大小,单位为byte,颗粒度大了会丢东西或EOF不准确,视所读取数据类型而确定。
nmemb想要读取的单元个数。
stream文件流指针。
返回值成功时为读取的单元个数,失败时返回0;返回值非常重要,在write时会用到,决定了写入量,精准定位EOF。
fwrite
用于将缓存中的数据写入目标文件中。
#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr存储将写入文件的缓存数据。
size每一个都单元的大小,单位为byte,颗粒度大了会丢东西或EOF不准确,视所写入数据类型而确定。
nmemb想要写入的单元个数。一般都是上一步fread函数的返回值。
stream文件流指针。
返回值成功时为写入的单元个数,失败时返回0。
fseek
修改文件流指针指向的位置。
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
stream文件流指针
whence为基准
offset文件基准起的偏移量单位为byte,向开头为负,向末尾则为正。
返回值成功为0,失败为-1。
whence | 含义 |
---|---|
SEEK_SET | 文件开头 |
SEEK_CUR | 当前文件流指针位置 |
SEEK_END | 文件末尾 |
ftell
得到文件流指针当前位置到文件开头的字节数。
#include<stdio.h>
long ftell(FILE *stream);
stream为文件流指针
返回值成功为文件流指针到文件开头的字节数。
feof
判断文件流是否结束
int feof(FILE *stream);
返回值:文件流没有结束时为0,结束了则为非0整数。
函数使用例子
文件复制
int filecp(char *filename1,char *filename2){
int rrn;
char buffer[1024];
FILE *r=fopen(filename1,"rb");
FILE *w=fopen(filename2,"wb");
while(0==feof(r)){
memset(buffer,0,sizeof(buffer));
rrn=fread(buffer,1,sizeof(buffer),r);
fwrite(buffer,1,rrn,w);
}
fclose(r);
fclose(w);
return 0;
}
将文件1复制到文件2。