Linux内核-标准IO和系统IO的区别

  1. 概念
    标准IO:指的是C语言实现的文件操作的函数
    系统IO(文件IO):指的是linux或windows或unix,实现文件操作的函数。

  2. 为什么要有两种IO
    C语言要实现跨平台,所以C语言在不同操作系统中实现文件操作方式是不一样的
    因为:标准IO函数会去调用系统IO函数

  3. 它们主要的区别
    标准IO有缓冲区,系统IO没有缓冲区

  4. 缓冲模式
    全缓冲模式:程序员自己打开的文件流
    1、当缓冲区满了,会实际执行IO操作。
    2、当执行fclose函数或fflush函数(不管缓冲区是否是满的,
    强制执行IO操作,刷新缓冲区的数据)
    3、当程序退出的时候,操作系统会帮我们把所有已打开的文件流进行关闭
    行缓冲模式:stdin,stdout
    1、行缓冲区满了,会执行执行IO操作。
    2、当缓冲区中存在了换行操作符\n,会执行IO操作。
    无缓冲模式:stderr

  5. 文件描述符
    C程序启动起来以后,会有三个默认的文件被打开,
    stdin(标准输入,编号0)、stdout(标准输出,编号1)、stderr(标准错误,编号2)
    如果我们也打开了一个fopen打开了一个文件,那么这个文件的编号就是3
    这种编号就称为文件描述符

  6. 流的概念
    stream 流:形象的比喻数据的流向。
    输入流:数据从文件到内存,I:Input
    输出流:内存流向文件,O:output
    生活中水流,有方向的

  7. 标准IO相关函数

    打开文件流:

	FILE *fopen(const char *pathname, const char *mode);
	 根据文件的路径,使用不同打开模式,打开一个文件,返回值是一个文件流
    FILE *fdopen(int fd, const char *mode);
	 	fd:文件描述符,socket 已经打开了一个文件,socket和文件结合起来,就可以使用fdopen。
    FILE *freopen(const char *pathname, const char *mode, FILE *stream);
	 	重新打开文件流,以前设置的文件流的属性,会被重置

按照文本方式读流:

  int fgetc(FILE *stream):从流中读取一个字符,返回值是负数代表的是读失败了,整数和0代表读出来的字符
  char *fgets(char *s, int size, FILE *stream):从stream中读取size个字符,读到s缓冲区中;读到内容返回是s,读不到内容返回NULL
  int getc(FILE *stream):同fgetc
  int getchar(void):从控制台拿一个字符,等同于getc(stdin)
  int ungetc(int c, FILE *stream):c字符放入stream流的后边,
  相当于将c追加到stream中

按照文本方式写流:

  int fputc(int c, FILE *stream):将字符c写入到stream中,如写成功返回c的int值,写失败返回的EOF
  int fputs(const char *s, FILE *stream):将字符串s写入到stream中,如果成功返回写入的个数,如果失败返回EOF
  int putc(int c, FILE *stream):同fputc
  int putchar(int c):往控制台输出一个字符串,等同于putc(c, stdout)
  int puts(const char *s):往控制台输出一行字符串,等同于fputs(s,stdout)

按照二进制方式读写流:

   size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream):
		   从stream中读取nmemb*size个字节,放到ptr中。
		   成功:返回的是读到了多少个单元数据
		   失败:若出现错误或到达文件末尾,则返回值可能小于nmemb或0。
   size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream):
		   从ptr中读取nmemb*size个字节,然后写入到stream中。
		    成功:返回的是写入了多少个单元数据
		    失败:若出现错误,则返回值可能小于nmemb或0

检查或者重置流状态:

	void clearerr(FILE *stream):
			   clearerr函数就是要复位这些错误标志,
			   也就是使fp所指向的文件的错误标志和文件结束标志置0,从而使文件恢复正常。
	int feof(FILE *stream):检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0
	int ferror(FILE *stream):如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,
			   对同一个文件 每一次调用输入输出函数,
			   均产生一个新的ferror函 数值,因此,应当在调用一个输入输出函数后立即检 查ferror函数的值,否则信息会丢失
	int fileno(FILE *stream):获取已经打开的文件描述符(用于获取系统io的文件描述符)

刷新流:

int fflush(FILE *stream):强制刷新输出缓冲区中的内容到文件中。
				stream为NULL,将强制刷新进程中的所有缓冲区
				stream是一个指定的文件流,会刷新stream输出缓冲区到文件中

重新定位流:

int fseek(FILE *stream, long offset, int whence);
			whence=SEEK_SET,offset=10,从文件的头开始计算,偏移10个字节
			whence=SEEK_CUR,offset = 2,从文件当前位置开始计算,向后偏移2个字节
			whence=SEEK_CUR,offset = -2,从文件当前位置开始计算,向前偏移2个字节
			whence=SEEK_END,offset = -2,从文件最后位置开始计算,向前偏移2个字节
			whence=SEEK_END,offset = 100,从文件最后位置开始计算,向后偏移100个字节
				设置成功:返回0
				设置失败:返回非0
				fseek函数限制是文件大小不能超过2G
long ftell(FILE *stream):获取当前文件的位置指针
void rewind(FILE *stream):文件位置指针设置到文件开头,等价于:(void) fseek(stream, 0L, SEEK_SET)
int fgetpos(FILE *stream, fpos_t *pos):等价于:ftell(从文件头开始计算)
int fsetpos(FILE *stream, const fpos_t *pos):等价于fseek函数(whence==SEEK_SETint fseeko(FILE *stream, off_t offset, int whence):
			和fseek类似,但是扩展了long的长度,前提是要加入宏_FILE_OFFSET_BITS
off_t ftello(FILE *stream):类似于ftell
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值