文件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的更多相关文章

  1. 文件IO和标准IO

    2015.2.26 星期四,阴天 今天的内容主要是文件IO man 手册的分册: man -f open 查看那些分册中有openman 1 -- 普通的命令程序man 2 -- 系统调用man 3 ...

  2. 文件IO和标准IO的区别【转】

    一.先来了解下什么是文件I/O和标准I/O: 文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O).不带缓存指的是每个read,write都调用内核中的一个系统调用.也就是一般所 ...

  3. 文件IO与标准IO的区别

    文件IO与标准IO的区别 文件I/O就是操作系统封装了一系列函数接口供应用程序使用,通过这些接口可以实现对文件的读写操作,文件I/O是采用系统直接调用的方式,因此当使用这些接口对文件进行操作时,就会立 ...

  4. 8 . IO类-标准IO、文件IO、stringIO

    8.1 IO类 #include <iostream> //标准IO头文件  8.2 文件输入输出流 #include <fstream> //读写文件头文件 std::fst ...

  5. 系统调用IO和标准IO

    目录 1. 系统调用IO(无缓冲IO) 系统调用 常用系统调用IO函数 open close read write lseek ioctl 2. 标准IO(带缓冲IO) 概述 缓冲与冲洗 常用标准IO ...

  6. linux c编程:标准IO库

    前面介绍对文件进行操作的时候,使用的是open,read,write函数.这一章将要介绍基于流的文件操作方法:fopen,fread,fwrite.这两种方式的区别是什么呢.1种是缓冲文件系统,一种是 ...

  7. linux标准IO缓冲(apue)

    为什么需要标准IO缓冲? LINUX用缓冲的地方遍地可见,不管是硬件.内核还是应用程序,内核里有页高速缓冲,内存高速缓冲,硬件更不用说的L1,L2 cache,应用程序更是多的数不清,基本写的好的软件 ...

  8. 2.Linux文件IO编程

    2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...

  9. 文件的概念、标准IO其一

    1.文件的概念 文件是一种存储在磁盘(掉电不丢失存储设备)上,掉电不丢失的一种存储数据的方式,文件在系统中有以下层次的结构来实现. 系统调用.文件IO.标准IO的关系如下: 2.linux系统的文件分 ...

随机推荐

  1. 02python程序设计基础——字符串

    字符串方法 format 1.替换字段名 在最简单的情况下,只需向 format 提供要设置其格式的未命名参数,并在格式字符串中使用未命名字段.此时,将按顺序将字段和参数配对.你还可给参数指定名称,这 ...

  2. Codeforces Round #573 (Div. 2) D. Tokitsukaze, CSL and Stone Game (博弈,思维)

    D. Tokitsukaze, CSL and Stone Game time limit per test1 second memory limit per test256 megabytes in ...

  3. Linux加载一个可执行程序并启动的过程

    原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 作者:严哲璟 以shell下 ...

  4. element-ui 表格标题换行

     render-header: 列标题 Label 区域渲染使用的 Function <template> <el-table :data="dataList"& ...

  5. 可决系数R^2和方差膨胀因子VIF

    然而很多时候,被筛选的特征在模型上线的预测效果并不理想,究其原因可能是由于特征筛选的偏差. 但还有一个显著的因素,就是选取特征之间之间可能存在高度的多重共线性,导致模型对测试集预测能力不佳. 为了在筛 ...

  6. 通过form提交 django的安全机制

    通过form提交 在form表单里面需要添加{%csrf_token%} 这样当你查看页面源码的时候,可以看到form中有一个input是隐藏的 总结原理:当用户访问login页面的时候,会生成一个c ...

  7. Git 回滚操作之 revert

    https://blog.csdn.net/HobHunter/article/details/79462899 https://blog.csdn.net/secretx/article/detai ...

  8. layui问题之渲染数据表格时,只显示10条数据

    通过ajax请求的数据,console.log()有30条数据,实际上只显示10条, 原因是没有设置limit table.render({ elem: '#report-collection' , ...

  9. angularJS拖动marker时popup一直显示

    $scope.$on('leafletDirectiveMarker.drag', function(event, arg) { arg.leafletObject.openPopup(); });

  10. npm cache clean --force

    当出现这个问题时npm ERR! Unexpected end of JSON input while parsing near '...,"dist":{"shasum ...