标准库IO与系统调用IO区别与联系
标准库IO接口:
一般程序运行起来,自动默认打开 标准输入文件 fd=0(scanf),标准输出文件 fd=1(printf), 标准错误文件 fd=2
- fopen 打开文件
FILE* fopen(带路径的文件名,打开方式:"r r+ w w+ a a+ b")
r:只读 若文件不存在报错返回
r+:可读可写 若文件不存在报错返回
w:只写,若文件不存在则创建,若文件存在,清空文件原有内容
w+:可读可写,若文件不存在则创建,若文件存在,清空文件原有内容
a:追加只写 每次写入数据追加到文件末尾,若文件不存在则创建
a+:可读 或 追加写入 每次写入数据追加到文件末尾,若文件不存在则创建
b:对文件数据进行原始二进制操作
返回值:成功:返回操作句柄:FILE*文件流指针 失败:返回NULL
- fwrite 写文件
size_t fwrite(写入文件数据(const void*ptr),size(块大小),nmemb(块个数)文件流指针)
块大小*块个数=写入总长度
返回值:完整写入文件的块个数 失败返回0
- fread 读文件
size_t fread(读取到数据的缓冲区地址(void*ptr),size(块大小),nmemb(块个数),文件流指针)
块大小*块个数=读取总长度
返回值:完整读取文件的块个数 设置块大小为长度 块个数为1 但不确定是否读入 可以设置块大小为1 快个数为一个数 根据返回块个数可以确定是否数据有读入 失败返回0或者读取到文件末尾也返回0
- fseek 跳转文件读写位置
int fseek(文件流指针,偏移量,偏移的相对起始位置(SEEK_SET:起始位置;SEEK_CUR:当前位置 SEEK_END:末尾))
成功返回0 错误返回-1
- fclose 关闭文件
代码演示
结果演示:
系统调用IO接口:
- open 打开文件
int open(文件路径名,标志位(类似于打开方式),文件权限)
标志位:必选项:O_RDONLY,O_WRONLY,O_RDWR
可选项:O_CREAT:如果文件不存在则创建
O_EXCL:如果文件已经存则报错返回
O_TRUNC:打开文件时截断文件长度为0 即清空内容
O_APPEND:将写入设置为追加写
使用过程中 将几个标志位通过‘|’(或操作)连接使用
文件权限前面要加0 如 0777 如果使用了O_CREAT就必须要指定文件权限 注意:此处会受到系统umask掩码影响 给定权限mode&~umask为实际权限
解决方法:在#include<sys/stat.h>调用umask(0)函数 设置当前程序掩码为0
返回值:成功返回非负数(操作句柄) 失败返回-1
- write
size_t write(open返回的操作句柄,要写入的数据缓存区buf,要写入的数据长度)
返回值:成功返回实际写入文件数据的长度 失败返回-1
- read
size_t read(open返回的操作句柄,读取到数据缓冲区buf,要读取的数据长度)
返回值:成功返回实际读取到的数据的长度 失败返回-1
- lseek
off_t fseek(open返回的操作句柄,偏移量,偏移的相对起始位置(SEEK_SET:起始位置;SEEK_CUR:当前位置 SEEK_END:末尾))
返回值:跳转后的位置相对于起始位置的偏移量(设置文件末尾 用于获取文件长度) 错误返回-1
- close
int close(open返回的操作句柄)
代码示例:
结果演示:
综上所述:库函数IO与系统调用IO功能类似,为什么还要对系统调用接口进行封装呢?
首先要理解open返回的操作句柄 即文件描述符--一个非负数 是如何描述一个具体文件呢?
文件描述符 为系统内核中进程所打开的文件描述信息表中的下标索引
文件描述符分配原则:在file_struct数组中,找到未被使用的最小下标,作为新的文件描述符
标准输入文件 fd=0(scanf),标准输出文件 fd=1(printf), 标准错误文件 fd=2
引入重定向概念:通过改变文件描述符下标位置所保存的文件描述信息,进而改变这个描述符所操作的文件,改变数据的流向
int dup2(int oldfd,int newfd)将newfd重定向到oldfd
文件流指针就是一个FILE*结构体指针,结构体中包含一个成员变量就是文件描述符
具体原理参照下图
库函数io与系统调用IO区别:
缓冲区:即换行刷新缓存区 是文件流指针所有的,对于文件描述符或系统调用来说是没有的
文件流指针的缓冲区被称之为:用户态缓冲区(内核空间+用户空间 一般所开辟的内存空间都在用户空间中)
标准库IO与系统调用IO区别与联系相关推荐
- c运行库、c标准库、windows API的区别和联系
c运行库.c标准库.windows API的区别和联系 C运行时库函数 C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的. API函数 API函数是操作系统为方便用户设计应用 ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)IO库 之操纵符
1. 控制浮点数格式 可以控制浮点数输出三个种格式 • 以多高精度( 多少个数字) 打印浮点值 • 数值是打印为十六进制. 定点十进制还是科学记数法形式 • 对于没有小数部分的浮点值是否打印小数点 1 ...
- linux下c标准库位置,C 标准库 IO 使用详解
其实输入与输出对于不管什么系统的设计都是异常重要的,比如设计 C 接口函数,首先要设计好输入参数.输出参数和返回值,接下来才能开始设计具体的实现过程.C 语言标准库提供的接口功能很有限,不像 Pyth ...
- C++prime读书笔记(二)C++标准库:IO、容器、泛型算法、动态内存
layout: post title: C++prime读书笔记(二)C++标准库:IO.容器.泛型算法.动态内存 description: C++prime读书笔记(二)C++标准库:IO.容器.泛 ...
- 标准IO与系统IO的区别
1.系统IO操作文件时是无缓冲输入,一般用于操作字符设备文件(LCD, LED, BEEP ...,数据需要实时刷新) 标准IO操作文件时是有缓冲输入,一般用于操作普通文件(.txt, .jpg.. ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)多字节低层IO操作
1. 多字节操作 一些未格式化 IO 操作一次处理大块数据,这些操作要求我们自己分配并管理用来保存和提取数据的字符数组 操作 解释 is.get(sink, size, delim) 从is中读取最多 ...
- Go 标准库: io
原文链接 http://ironxu.com/772 本文介绍Go 标准库 io 常用的导出函数,结构体和方法. io 包提供了对 I/O 原语的基本接口,这些接口抽象出了泛用的函数并附加了一些操作. ...
- Python标准库中的io
Python标准库中io模块中有两个比较重要的组成部分:StringIO.BytesIO 1.StringIO StringIO 的作用是在内存中读写字符串,其示例代码如下: from io impo ...
- C++知识点15——使用C++标准库(IO流)
1.IO类就是负责输入输出的类,包括输入输出到文件,字符串以及控制台 常用的IO类和所在头文件如下 #include <iostream> istream //从流中读取数据 ostrea ...
最新文章
- 虚拟机和java虚拟机
- php53 php55区别,详解 PHP 中的三大经典模式
- 分区表PARTITION table
- java web启动socket_javaweb启动时启动socket服务端代码实现
- 「动手学深度学习」在B站火到没谁,加这个免费实操平台,妥妥天花板
- bash快捷键(防忘)
- oracle 10g的安装配置
- require smarty.class.php 报错,Smarty 报错
- iphone震动反馈怎么设置_苹果魅族都在用的震动反馈 到底是怎样实现的?
- 利用MPU6050 + OLED屏显示3D矩形效果
- postgres汉字转换为拼音
- JDK8 Instant类的使用和LocalDate,LocalTime 和 LocalDateTime的介绍。
- 云课堂软件工程(C编码实践篇)学习之我见
- QT教程 休闲棋牌游戏开发(2)
- Android系统定时开关机实现简述
- Git简介、安装教程附安装包
- 设计模式之工厂方法模式(Factory Method)
- RapidScada免费开源Scada组态软件系列教程7-Linux下系统的运行
- 如何用vue做一个二级联动
- 名帖03 李阳冰 篆书《谦卦碑》
热门文章
- 遥感计算机解释技术PPT,第六章遥感数字图像计算机解译ppt课件.ppt
- 6款超实用资源网站,找图、办公、学习都满足你
- python教程 网易公开课_如何用Python抓取网易公开课的视频?
- 计算机专业英语作业1,计算机专业英语作业(1)
- 如何使用svn导出项目
- 准考证打印系统关闭怎么办_准考证打印系统关闭怎么办_公务员考录专题网站...
- JQuery蒙板层(特效)
- 2019年Java程序员金三银四跳槽季,机会只留给有准备的人!
- 速记java八大基本数据类型
- 2018年最佳设计规范20例免费下载