内核IO和标准IO

对于文件的读写操作函数在执行的空间来分,可以分为内核IO(主要在内核中运行)和标准IO(主要在用户空间中运行).

内核IO需要自己创建和管理缓存,而标准IO是自动分类缓存,一般来说,内核IO的效率高于标准IO,但是差距不是很大,考虑移植性,还是建议使用标准IO(只要是支持标准C语言就支持标准IO).

无论是标准IO还是内核IO都是对文件的信息,读写文件的指针进行记录的,调用相应的函数可以进行文件信息的读取和指针的修改.

以下为IO相关的函数的头文件,使用,参数,返回值的说明

linux C语言IO 函数(内核IO) :open/close/lseek/read/write

头文件:<sys/types.h>,<sys/stat.h>,<fcntl.h>//打开文件
open("文件路径及文件名",打开方式,(如果创建则有这个参数,设置文件权限));返回值位int型,-1为失败,正整数为成功,是该文件的标识符;

头文件:<unistd.h>
close(int (打开文件的文件标识符));//关闭文件

头文件:<sys/types.h>,<unistd.h>//每个文件的打开都会有一个读写指针,该函数是调整文件的读写指针到指定的位置
lseek(int fildes,新的读写位置(作为whence的参数),int whence); fildes :文件描述符 ;whence:操作。
返回值:-1为出错。成功为返回当前的指针位置。

头文件:<unistd.h>//读文件的内容
read(int fd,void *buf,int count);fd:文件描述符;buf:将读出的文件存放的地方;count:一次读取的字节数
返回值:-1为出错(出错则读写指针不知道指向了哪里)返回0则是读到文件尾或者遇到没法读取的数据。正常是返回读取的实际字节数

头文件:<unistd.h>//进行写操作
write(int fd,const void *buf,int count);fd:文件描述符;buf:需要写的内容 ;count:一次写了的字节数;
返回值:-1出错,正常则返回实际字节数。

标准C语言IO函数(标准IO):
fopen/fclose/
fputs/fgets/
fflush/ftell
fseek/rewind/
gets/puts/
fprintf/sprintf/
fgetc/fputc/
feof/
ferror/clearerr/
fread/fwrite/

头文件:<stdio.h>//打开文件
fopen(const char * path,const char *mode);path:要打开的文件路径和文件名;mode:打开方式
返回值:FILE* 类是与open 的文件标识符 打开失败则返回NULL;

头文件:<stdio.h>//关闭文件
fclose(FILE *stream);
返回值:-1则有错误发生,成功返回0;

头文件:<stdio.h>//将文件流中读取字符串到format中
int fscanf(FILE*stream,const char *format,......);
返回值:成功则返回参数数目,失败则返回-1

头文件:<stdio.h>//根据字符串格式转化数据,并将结果输入到指定文件中
int fprintf(FILE*stream,const char *format,......);
返回值:成功返回写的字节数,错误则-1;

头文件:<stdio.h>//将文件内容读取到s中
fgets(char *s,int size, FILE *stream);*s:存储文件内容,size:读取的字节数(读取size - 1个字节,最后会加上NULL);
返回值:char*,成功则返回s指针,失败则返回NULL

头文件:<stdio.h>//将文件内容写入文件中
fputs(const char *s,FILE*stream);
返回值:成功返回写的字节数,错误则-1;

头文件:<stdio.h>//从文件中读取一个字符
fgetc(FILE*stream);
返回值:正常则返回读取到的字符,若读到-1则表示读到文件尾了。

头文件: <stdio.h>//将指定字符写入文件流
fputc(int c,FILE* stream);c 是写入的值,会自动转化为unsigned char 然后再写入文件
返回值:-1写入失败 ,正常则返回成功写入的字符 int

头文件:<stdio.h>//由标准输入设备内读进一字符串
char * gets(char *s);读取字符到s中,读取到换行字符或者读取到文件尾为之,
最后加上NULL作为字符串结束
返回值:正常返回s指针,返回NULL则表示发生错误。

头文件:<stdio.h>//将字符串写到标准输出(STDOUT)
int puts(char *str);
返回值:成功返回非负值,失败返回-1;

头文件:<stdio.h>//强制刷新缓存区,将缓存区内容写入文件
fflush(FILE*stream);
返回值:成功0,失败-1

头文件:<stdio.h>//移动文件读取指针
fseek(FILE*stream,long offset,int whence(宏));offset:文件读取指针移动的位置。
fseek(FILE*stream,0,SEEK_SET/SEEK_END);移动指针到文件头/文件尾
返回值:成功0,失败-1

头文件:<stdio.h>//将文件读取指针移动到文件开头
void rewind(FILE*stream);

头文件:<stdio.h>//获取文件流目前的读写位置
long ftell(FILE*stream);
返回值:-1错误,成功返回当前的文件读写指针

头文件:<stdio.h>//检查文件读取指针是否已经到了文件尾
int feof(FILE*stream);
返回值:到了文件尾则返回非零值,否则返回0

头文件:<stdio.h>//检查文件流是否有错误发生
int ferror(FILE*stream);
返回值:发生错误返回非零。无错误返回0;

头文件:<stdio.h>//清除文件流中的错误旗标
void clearerr(FILE*stream);

头文件:<stdio.h>//从文件流读取数据
int fread(void *ptr,int size,int nmemb,FILE*stream);
ptr:存放读取到的内容
size:读取一个单元的字节数
nmemb:读取的单元数
返回值:返回值比nmemb小那么表示读到文件尾或者有错,需要feof(),或者ferror()来判断

头文件:<stdio.h>//将数据写到文件流中
int fwrite(const void *ptr,int size,int nmemb,FILE*stream);//参数类同fread()
返回值:返回实际写入nmemb

时间: 2024-10-21 18:24:48

内核IO和标准IO的相关文章

文件IO和标准IO

2015.2.26 星期四,阴天 今天的内容主要是文件IO man 手册的分册: man -f open 查看那些分册中有openman 1 -- 普通的命令程序man 2 -- 系统调用man 3 -- 库函数 文件:操作系统将硬件抽象成文件输入:将设备中的数据写进到内存输出:将内存中的数据写出到设备 Linux的文件系统由两层结构构成:第一层是虚拟文件系统(VFS),第二层是各种不同的具体的文件系统 posix:可移植操作系统接口规范API:用户编程接口 应用通过POSIX和GNU C LI

LINUX原始IO和标准IO

linux编程中有两类IO, 一类是标准库提供的IO函数fopen, fread , fwrite. 一类是系统接口函数 read ,write等.本文说明两类IO的区别和联系. 区别: 首先看一下两类IO函数的定义: fread:     size_t fread ( void *buffer, size_t size, size_t count, FILE *stream) ;      read :       ssize_t read (int fd, void *buf, size_t

第一天20150829:标准IO 和 系统IO -----stdio and sysio

IO 的实现包括两种实现: 1.stdio标准IO 2.sysio系统IO IO的两种实现方式正常都可以使用.但是,在使用的过程中优先使用stdio标准IO. 首先要了解这两种实现的原理: 1.sysio系统IO:我们作为USER 要与内核对话,那么系统为我们提供了一个sysio,可以直接对话KERNAL. 那么问题就产生了:如果USER使用的平台环境不一样(有的人有linux,有的人用windows),那么由于KERNAL不一样,那么提供给USER的sysio也会不一样 2.所以引申出来一个标

Unix环境之标准IO库

UNIX的文件IO都是针对文件描述符的,而标准IO的操作则是围绕流进行的.当一个流最初被创建时,它并没有定向.若在未定向的流上使用一个多字节IO函数,则将该流的定向设置为宽定向:若在未定向的流上使用一个单字节IO函数,则将该流的定向设置为字节定向. stdio.h定义了三个标准流,stdin.stdout和stderr,分别是标准输入.标准输出和标准出错. 缓冲-- 标准IO库提供缓冲的目的是尽可能减少使用read和write调用的次数.它也对每个IO流自动地进行缓冲管理,从而避免了应用程序需要

标准IO与文件IO 的区别【转】

本文转载自:http://blog.sina.com.cn/s/blog_63f31f3401013jrn.html 先来了解下什么是标准IO以及文件IO. 标准IO:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性.标准IO库处理很多细节.例如缓存分配,以优化长度执行IO等.标准的IO提供了三种类型的缓存. (1)全缓存:当填满标准IO缓存后才进行实际的IO操作.         (2)行缓存:当输入或输出中遇到新行符时,标准

[APUE]标准IO库(下)

一.标准IO的效率 对比以下四个程序的用户CPU.系统CPU与时钟时间对比 程序1:系统IO 程序2:标准IO getc版本 程序3:标准IO fgets版本 结果: [注:该表截取自APUE,上表中"表3-1中的最佳时间即<程序1>","表3-1中的单字节时间指的是<程序1>中BUFSIZE为1时运行时间结果",fgetc/fputc版本程序这里没放出] 对于三个标准IO版本的每一个其用户CPU时间都大于最佳read版本,因为每次读一个字符

标准IO与文件IO 的区别

1.定义 标准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都

读书笔记-APUE第三版-(5)标准IO库

ISO C标准I/O库使用流的概念读写文件.流是对数据传输的抽象,可以把流理解为从起点到终点间的字节序列. 标准I/O库通过维护进程空间内的缓冲区,减少read/write系统调用次数来提高I/O效率.之前介绍的Unbuffered I/O和文件描述符fd打交道,标准I/O则使用FILE指针. typedef struct{ short level;/*缓冲区满程度*/ unsigned flags;/*文件打开状态标志*/ char fd;/*文件描述符*/ unsigned char hol

UNIX高级环境编程(7)标准IO函数库 - 二进制文件IO,流定位,创建临时文件和内存流

? 1 二进制IO(Binary IO) 在前一篇我们了解了逐字符读写和逐行读写函数. 如果我们在读写二进制文件,希望以此读写整个文件内容,这两个函数虽然可以实现,但是明显会很麻烦且多次循环明显效率很低. 为了应对这种场景,标准IO库提供了fread和fwrite函数. 函数声明: #include <stdio.h> size_t fread(void *restrict ptr, size_t size, size_t nobj, FILE *restrict fp); size_t fw