文件IO与标准IO -缓存

文件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(互斥关系,必须包含一个):

文件IO与标准IO -缓存_第1张图片

 次flags:可选

文件IO与标准IO -缓存_第2张图片

 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:打开二进制文件

标准IO和文件IO打开文件标志对比
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())

你可能感兴趣的:(C语言)