文件IO和标准IO的区别:
文件IO属于系统调用,仅可在类UNIX系统中使用,可移植性差;
标准IO是标准IO基于标准C库的进一步封装,可在windows、linux等操作系统下使用,可移植性好,但是存在于用户空间,调用的效率较低。
文件IO:直接调用内核提供的系统调用函数,头文件是unistd.h
文件IO操作:open、close、read、write、lseek等;
ssize_t write(int fd, const void *buf, size_t count);
ssize_t read(int fd, void *buf, size_t count);
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
主flags(互斥关系,必须包含一个):
次flags:可选
mode参数:设置不同用户对新文件的读写权限标志。可由八进制数字给出的时候,如 0777
标准IO:间接调用系统调用函数(代码调用C库函数来间接调用系统函数),头文件是:stdio.h
标准IO操作:fopen fclose (fseek rewind ftell文件读取指针的位置相关指针)
FILE *fopen(const char *pathname, const char *mode);
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);
标识文件方法:文件流指针
缓存:用户缓存(标准/文件IO)、内核缓存(标准/文件IO)、库缓存(标准IO);
模式:
+:可读可写,
w:新建文件、清空文件、可读
r:可读
a:清空文件、可写、写开始位置在文件结尾,不可新建
b:打开二进制文件
fopen() mode | open() flags |
r | O_RDONLY |
w | O_WRONLY | O_CREAT | O_TRUNC |
a | O_WRONLY | O_CREAT | O_APPEND |
r+ | O_RDWR |
w+ | O_RDWR | O_CREAT | O_TRUNC |
a+ | O_RDWR | O_CREAT | O_APPEND |
printf函数将库缓存写入内核缓存的条件:
1、遇到'\n';
2、库缓存写满时。1K
三类读写函数:
- 行缓存: 遇到新行符(\n)或写满缓存时调用系统函数
读:fgets,gets,printf,fprintf,sprintf,stdout
写:fputs,puts,scanf
gets 未指定读的缓存大小、只能从标准输入来读 、'\n'被gets自动忽略
puts 只能标准输出、输出时自动添加'\n'
printf 只能写到标准输出
sprintf 写到一个字符串中
fprintf 写到普通文件中或者标准输出等
fclose()用于关闭一个文件。在该文件被关闭之前,刷新缓存中的数据。如果标准I/O库已为该流自动分配了一个缓存,则释放此缓存。
fflush():刷新缓存函数。把库函数缓存的内容强制写入内核。
- 无缓存:用户调用函数,就会将内容写到内核
stderr
- 全缓存:只有写满缓存时才会调用系统函数
读:fread
写:fwrite
当返回错误时,判断是到达文件结尾(feof())还是读写出错(ferror())