linux文件io与标准io
文件IO实际是API,Linux对文件操作主要流程为:打开(open),操作(write、read、lseek),关闭(close).
1.打开文件函数open():
涉及的头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
函数原型:
int open(const char *pathname, int flags); //pathname是要打开的文件名,可以包括路径。flags有:O_RDWR/O_RDONLY/O_WRONLY,分别表示以可读写/只读/只写模式打开,可与O_APPEND(追加)、O_TRUNC(把文件长度设为0,丢弃已有内容)、O_CREAT(当文件不存在时创建,一般要与O_EXCL合用,否则打开的文件存在时,会把原文件覆盖,加上O_EXCL后,原文件存在时,会打开报错 file exists),当O_APPEND与O_TRUNC 一起使用时,O_TRUNC会屏蔽O_APPEND的作用。
一般在open时,都要判定是否打开成功,当返回值为-1时,打开失败,成功时,返回文件描述符(fd),该描述符就与该文件绑定,之后再操作文件,都是针对文件描述符的,fd是一个正整数,出错时可用perror("提示符");打印出错信息。
int open(const char *pathname, int flags, mode_t mode); //一般用到O_CREAT时才用到,mode参数用于指定创建的文件的权限,如0666
2.操作
write函数涉及的头文件:
#include <unistd.h>
函数原型:
ssize_t write(int fd, const void *buf, size_t count); //fd:文件描述符,buf:需要写入的内容指针,count:需要写入的byte数,ssize_t:实际写入字节个数,有时候count会小于ssize_t,因为可能文件中没有count个字节。
----------------------------------------------------------
read函数涉及的头文件:
#include <unistd.h>
函数原型:
ssize_t read(int fd, void *buf, size_t count); ///fd:文件描述符,buf:需要读入的内容指针,count:需要读入的byte数,ssize_t:实际读入字节个数,有时候count会小于ssize_t,因为可能文件中没有count个字节。
----------------------------------------------------------
文件指针操作lseek()涉及的头文件:
#include <sys/types.h>
#include <unistd.h>
函数原型:
off_t lseek(int fd, off_t offset, int whence); //fd:文件描述符,offset:偏移量,whence:定义该偏移值的用法,取值:SEEK_SET/SEEK_CUR/SEEK_END,分别表示:文件指针指向文件起始,文件指针指向当前位置,文件指针指向文件末尾。返回值为文件指针移动到指定位置的偏移量,这里的单位是byte
3.关闭
close()涉及的头文件:
#include <unistd.h>
函数原型:
int close(int fd); //关闭文件,成功返回0,失败返回 -1
补充:linux实现文件共享的方式,即创建不同的fd指向同一个文件。可能出现以下几种情况:
a. 同一进程中多次open(),获取不同fd;未使用O_APPEND,分别写,使用后,接续写。O_APPEND会在一个fd中的文件指针移动后,通知另一个fd的文件指针,让其移动,实现接续写
b.多个进程open(),获取fd指向同一文件;分别写
c.使用dup(与close配合可重定位标准输出,返回的fd由系统分配),dup2复制文件指针(返回的fd可自定)。接续写,得到的fd都指向原来的文件,close只需关闭被复制的文件描述符即可。
标准IO,实际是C库函数,由库函数把系统API封装而来。库函数比API好一点的地方是API不可以通用,不可移植,而C库函数在不同操作系统中几乎是一样的。 可移植性好。
常用的有fopen()、fread()、fwrite()、fclose()、fflush()(标准io有带缓冲区,等缓冲区满时才会写,当需要立即写时,调用此函数便不会等待io缓冲区满,而是直接写),flseek(). 具体用法 man 3 库函数名
linux文件io与标准io的更多相关文章
- 文件IO和标准IO
2015.2.26 星期四,阴天 今天的内容主要是文件IO man 手册的分册: man -f open 查看那些分册中有openman 1 -- 普通的命令程序man 2 -- 系统调用man 3 ...
- 文件IO和标准IO的区别【转】
一.先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用.也就是一般所 ...
- 文件IO与标准IO的区别
文件IO与标准IO的区别 文件I/O就是操作系统封装了一系列函数接口供应用程序使用,通过这些接口可以实现对文件的读写操作,文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立 ...
- 8 . IO类-标准IO、文件IO、stringIO
8.1 IO类 #include <iostream> //标准IO头文件 8.2 文件输入输出流 #include <fstream> //读写文件头文件 std::fst ...
- 系统调用IO和标准IO
目录 1. 系统调用IO(无缓冲IO) 系统调用 常用系统调用IO函数 open close read write lseek ioctl 2. 标准IO(带缓冲IO) 概述 缓冲与冲洗 常用标准IO ...
- linux c编程:标准IO库
前面介绍对文件进行操作的时候,使用的是open,read,write函数.这一章将要介绍基于流的文件操作方法:fopen,fread,fwrite.这两种方式的区别是什么呢.1种是缓冲文件系统,一种是 ...
- linux标准IO缓冲(apue)
为什么需要标准IO缓冲? LINUX用缓冲的地方遍地可见,不管是硬件.内核还是应用程序,内核里有页高速缓冲,内存高速缓冲,硬件更不用说的L1,L2 cache,应用程序更是多的数不清,基本写的好的软件 ...
- 2.Linux文件IO编程
2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...
- 文件的概念、标准IO其一
1.文件的概念 文件是一种存储在磁盘(掉电不丢失存储设备)上,掉电不丢失的一种存储数据的方式,文件在系统中有以下层次的结构来实现. 系统调用.文件IO.标准IO的关系如下: 2.linux系统的文件分 ...
随机推荐
- PAT Advanced 1077 Kuchiguse (20 分)
The Japanese language is notorious for its sentence ending particles. Personal preference of such pa ...
- 树状数组求LIS模板
如果数组元素较大,需要离散化. #include <iostream> #include <cstdio> #include <cstring> #include ...
- Java数据封装成树形结构,多级
参考地址:https://blog.csdn.net/chendu500qiang/article/details/91493147 1.实体类 @data public class PublishS ...
- 配置本地yum仓库
前言 我们知道yum工具是基于rpm的,其一个重要的特性就是可以自动解决依赖问题,但是yum的本质依旧是把后缀名.rpm的包下载到本地,然后按次序安装之.但是每次执行yum install x ...
- 第一次接触oracle
登录 SQLPLUS cmd sqlplus [用户名]/[密码][@数据库] [参数] sqlplus sys/orcl as sysdba -- 登录 sys 用户,必须指定 sysdba 或 s ...
- eclipse中export 的jar file与 runnable jar file的区别
(1)直接运行 .class的方法 java -cp . com.guangfa.demo1 , 不用加.class后缀 .-cp 是 -classpath 缩写,是指定类运行所依赖其他 ...
- A1002
多项式相加,按非零项个数,指数,系数输入两个n项多项式,合并同类项之后输出. 用数组编号保存指数,编号对应的数组值保存系数,相加之后用count记录非零项的个数,最后输出. 数组最大1000个,如果有 ...
- CSS背景和CSS3背景background属性
css背景属性用于定义HTML元素的背景 背景属性既可以为单个的单元设置背景,也可以为整个页面设置背景,可以对上述二者的任意组合设置背景,段落.文字.不同状态的链接.图像.内容区域修改其背景样式.设置 ...
- idea创建项目和依赖
创建项目和依赖 项目搭建完成后打开web.xml可看到如图使用的是servlet2.3,但版本太老,servlet2.3 jsp 的el表达式不工作,所以我们需要切换新版本. 切换新版本方法:打开t ...
- Spark Streaming的优化之路—从Receiver到Direct模式
作者:个推数据研发工程师 学长 1 业务背景 随着大数据的快速发展,业务场景越来越复杂,离线式的批处理框架MapReduce已经不能满足业务,大量的场景需要实时的数据处理结果来进行分析.决 ...