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系统的文件分 ...
随机推荐
- CDate()函数
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant. CDate(date) date 参数是任意有效的日期表达式. 说明 IsDate 函数用于判断 date 是否 ...
- Uva 10635 - Prince and Princess LCS/LIS
两个长度分别为p+1和q+1的由1到n2之前的整数组成的序列,每个序列的元素各不相等,两个序列第一个元素均为1.求两个序列的最长公共子序列 https://uva.onlinejudge.org/in ...
- Python 面向对象编程之进阶使用
我们在https://www.cnblogs.com/yinsedeyinse/p/9976280.html中学习了面向对象的编程方法.现在学习他的进阶用法. 1. 静态方法 2. 类方法 3. 属性 ...
- apache-2.4.x 编译安装方法
apache-2.4.x 编译安装方法 作者:朱 茂海 /分类:Apache 字号:L M S apache-.2与新出的apache-.4安装不同的地方在于,.4版的已经不自带apr库,所以在安装a ...
- 0-4评价一个语言模型Evaluating Language Models:Perplexity
有了一个语言模型,就要判断这个模型的好坏. 现在假设: 我们有一些测试数据,test data.测试数据中有m个句子;s1,s2,s3-,sm 我们可以查看在某个模型下面的概率: 我们也知道,如果计算 ...
- rocketmq特性(features)
# 特性(features) 1 订阅与发布 消息的发布是指某个生产者向某个topic发送消息:消息的订阅是指某个消费者关注了某个topic中带有某些tag的消息,进而从该topic消费数据. 2 消 ...
- css常用小知识点汇总(一)
1.文本过多溢出,怎么让他隐藏变成点点点(...)呢? text-overflow:ellipsis;overflow:hidden;display:-webkit-box;-webkit-line- ...
- tomcat 启动一傘而过问题
tomcat 启动一傘而过问题 D:\apache-tomcat-7.0.75\bin startup.bat打开记事本打开 第一行:设置启动环境变量JAVA_HOME,CATALINA_HOME S ...
- 最大 k 乘积问题 ( 经典区间DP )
题意 : 设 NUM 是一个 n 位十进制整数.如果将 NUM 划分为 k 段,则可得到 k 个整数.这 k 个整数的乘积称为 NUM 的一个 k 乘积.试设计一个算法,对于给定的 NUM 和 k,求 ...
- 倍增O(1)求区间&值与|值
;i<=n;++i) f[i][]=a[i],g[i][]=a[i]; ;(<<j)<=n;++j) ;(i+(<<j)-)<=n;i++) { f[i][j ...