标准IO和文件IO的区别

标准IO和文件IO的区别,第1张

先来了解下什么是标准IO以及文件IO。

标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的毁简可移植性。标准IO库处理很多细节。例如缓存分配,以优化长度执行IO等。标准的IO提供了三种类型的缓存。

(1)全缓存:当填满标准IO缓存后才进行实际的IO *** 作。 (2)行缓存:当输入或输出中遇到新行符时,标准IO库执行IO *** 作。 (3)不带缓存:stderr就是了。

文件IO:文件IO称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O—— *** 作系统提供的基本IO服务,与os绑定念余首,特定于linix或unix平台。

2区别

首先:两者一个显著的不同点在于,标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区),还创建了一个包含文件和缓冲区相关数据的数据结构。低级I/O一般没有采用缓冲,需要自己创建缓冲区,不过其实在linix或unix系统中,都是有使用称为内核缓冲的技术用于提高效率,读写调用是在内核缓冲区和进程缓冲区之间进行的数据复制。

其次从 *** 作的设备上来区分,文件I/O主要针对文件 *** 作仔数,读写硬盘等,它 *** 作的是文件描述符,标准I/O针对的是控制台,打印输出到屏幕等,它 *** 作的是字符流。对于不同设备得特性不一样,必须有不同api访问才最高效。

标准IO库是于1975年左尘首右编写完成的,用于处理流和文件的一个库.

标准IO库可以在很多 *** 作系统下移植

经过30多年,标准IO库没有发生什么重大变化

流和FILE对象

基本IO是针对文件描述符的,而标准IO是基于流的.当通过标准IO打开或者创建文件的时候,系统使用一个流和文件相关联.在Unix环境中,标准IO库是建立在基本IO基础之上的

标准IO库中的流以FILE *的形式表现,各种标准IO库函数使用

为了增加对国际化的支持,最新的标准IO库增加了对宽字符的支持

标准输入,标准输出和标准错误

按照惯例,Unix进程使用三个默认的文件描述符,分别是STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO

标准IO库中预定义了三个流stdin, stdout, stderr,可以自动被进程使用,分别是标准输入,标准输出和标准错误.它们引用的文件和STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO指向的文件相同

缓冲

标准IO库通过调用宴兄搭read/write系统调用来实现真正的IO

为了减少调用read/write的次数,标准IO库提供了缓冲 注意,这个缓冲是在用户态的

有3种类型的缓冲

全缓冲

行缓冲

不缓冲

可以通过setbuf函数对指定的流设置缓冲类型

ISO C规定

当且仅当stdin/stdout不涉及交互设备时,它们才是全缓冲

stderr决不会是全缓冲的

默认的

stderr是不带缓冲的

其他流,如果涉及到终端设备,则是行缓冲的,否则是全缓冲的

和缓冲相关的几个函数

设置流的缓冲

void setbuf(FILE *fp, char *buf)

int setvbuf(FILE *fp, char *buf, int mode, size_t size)

强制刷新流缓冲

int fflush(FILE *fp)

打开流

FILE *fopen(char *pathname, char *type)

FILE *freopen(char *pathname, char *type, FILE *fp)

FILE *fdopen(int filedes, char *type)

打开方式

r 为读而打晌拿开

w 把文件截短为0长,为写而创建

a 为在文件末尾写而打开,或为写创建

r+ 为读和写而打开

w+ 把文件截短为0长,为读和写而创建

a+ 为在文件末尾写而打开或创建

还可以加上"b",表示以二进制方式打开,但Unix内核并不区分字符文件和二进制文件,这个标志无意义

关闭流

int fclose(FILE *fp)

读流

int fgetc(FILE *fp)

int getchar()//= fgetc(stdin)

int ferror(FILE *fp)

int feof(FILE *fp)

void clearerr(FILE *fp)

ungetc(int c, FILE *fp)

写流

int fputc(int c, FILE *fp)

int putchar(c)// fputc(c, stdout)

每次一行IO

输入一行

char *fgets(char *buf, int n, FILE *fp)

char *gets(char *buf)

输出一行

int fputs(char *str, FILE *fp)

int puts(char *str)

二进制IO

size_t fread(void *ptr, size_t size, size_t nobj, FILE *fp)

size_t fwrite(void *ptr, size_t size, size_t nobj, FILE *fp)

定位流

返回当前文件位置

long ftell(FILE *fp)

定位到指定位置

int fseek(FILE *fp, long offset, int whence)

void rewind(FILE *fp)

格式化输出

int printf(char *format, ...)

int fprintf(FILE *fp, char *format, ...)

int sprintf(char *buf, char *format, ...)

int snprintf(char *buf, size_t n, char *format, ...)

格式字符串

%[flags][width][precision][length]type

flags: 对齐,填0等控制

width: 输出宽度

precision: 精度

length: 长度修饰

type: 转换类型

几个变体

int vprintf(char *format, va_list arg)

int vfprintf(FILE *fp, char *format, va_list arg)

int sprintf(char *buf, char *format, va_list arg)

int snprintf(char *buf, size_t n, char *format, va_list arg)

格式化输入

int scanf(char *format, ...)

int fscanf(FILE *fp, char *format, ...)

int sscanf(char *buf, char *format, ...)

返回值: 输入的项数,如果到达文件末尾则返回EOF

临时文件

产生一个临时文件名

char *tmpnam(char *ptr)

产生并打开一个临时文件

FILE *tmpfile(void)

使用临时文件

调用tmpnam产生一个路径名

用该路径名创建一个文件

立即unlink它

使用临时文件

关闭临时文件,系统自动删除它


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12138884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存