POSIX标准

open函数属于Linux中系统IO,用于“打开”文件,代码打开一个文件意味着获得了这个文件的访问句柄。

int fd = open(参数1,参数2,参数3);

int fd = open(const char *pathname,int flags,mode_t mode);

1.句柄(file descriptor 简称fd)

首先每个文件都属于自己的句柄,例如标准输入是0,标准输出是1,标准出错是2。

每打开一个文件就会返回句柄来操作这个文件,一般是从3开始,然后4,5,6一直下去。

close(fd)之后句柄就返回给系统,例如打开一个文件后fd是3,close之后再打开另外一个文件也还是3,但代表的文件不一样了。

2.使用open前需要先包含头文件

#include <sys/types.h>

#inlcude <sys/stat.h>

#inlcude <fcntl.h>

3.参数1(pathname)

即将要打开的文件路径,例如:“a.txt”当前目录下的a.txt文件

4.参数2(flags)

flags分为两类:主类,副类

主类:O_RDONLY 以只读方式打开   /   O_WRONLY 以只写方式打开   /O_RDWR 以可读可写方式打开

三这是互斥的

副类:

O_CREAT 如果文件不存在则创建该文件

O_EXCL 如果使用O_CREAT选项且文件存在,则返回错误消息

O_NOCTTY 如果文件为终端,那么终端不可以调用open系统调用的那个进程的控制终端

O_TRUNC 如果文件已经存在则删除文件中原有数据

O_APPEND 以追加的方式打开主副可以配合使用,

例如:O_RDWR|O_CREAT|O_TRUNC

5.参数3(mode)

mode:如果文件被新建,指定其权限未mode

mode是八进制权限码,0777表示文件所有者   该文件用户组     其他用户都有可读可写可执行权限

//例:
int fd;
fd = open("file",O_RDONLY);
if(fd < 0)
打开失败
else
打开成功

  

read函数 读取文件  磁盘上一份 内存中一份

ssize_t count = read(参数1,参数2,参数3)

ssize_t read(int filedes,void *buf,size_t nbytes);

1.count 返回读到的字节数

若成功返回读到的字节数,若读到文件末尾返回0,若失败返回-1。

2.使用read前需要先包含头文件

#include <unistd.h>

3.参数1 (filedes)

filedes:open函数的成功返回值

4.参数2 (buf)

内存地址(开辟空间 栈、堆)

5.参数3 (nbytes)

数据大小(空间大小)

例如:
1 #include <stdio.h>
2 #include <fcntl.h>
3
4 int main(int argc,char **argv)
5 {
6 int fd;
7 char ch;
8 //打开文件
9 fd = open("file",O_RDONLY);//abcdefg
10 if(fd < 0)
11 //打开失败
12 return -1;
13 //读取文件
14 read(fd,&ch,1);
15 printf("%c\n",ch);
16 read(fd,&ch,1);
17 printf("%c\n",ch);
18 return 0;
19 }

  问题:那么一次到底读取多少字节合适?

  4096 8192
  BUFSIZ  8192
  char buf[BUFSIZ];
  read(fd,buf,sizeof(buf)-1);
 
write函数  将内存中的数据写入到文件中
ssize_t count = write(参数1,参数2,参数3)
ssize_t write(int filed,const void *buf,size_t nbytes);
1.count 写入的字节数
返回值:返回实际写入的字节数,若出错则返回-1。

2.使用write前需要先包含头文件

#include <unistd.h>

3.参数1(filed)

open函数的成功返回值
4.参数2(buf)
内存地址
5.参数3(nbytes)
数据大小
 
lseek函数  修改偏移量  影响下一次读写的操作
off_t currpos = lseek(参数1,参数2,参数3)
off_t lseek(int fileds,off_t offset,int whence);
1.currpos 新的文件偏移量
返回值:若成功返回新的文件偏移量,若出错返回-1。

2.使用write前需要先包含头文件

#include <unistd.h>

3.参数1(fileds)

open函数的成功返回值
4.参数2(offset)
偏移量     -?  0   +?
5.参数(whence)
相对位置
            文件开始            当前位置            文件末尾
            SEEK_SET           SEEK_CUR          SEEK_END
 
close函数:关闭文件
close(参数1)
参数1:open函数的成功返回值
 
最后来一个程序来训练一下这几个函数(read和write函数复制一个文件)
#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<sys/types.h>

#include<sys/stat.h>

#include<unistd.h>

#include<fcntl.h>

#define BUFFER_SIZE 1024

int main( int argc,char **argv)

{

    int from_fd,to_fd;

    long file_len=0;

    int ret=1;

    char buffer[BUFFER_SIZE];

    char *ptr;

    //判断入参

    if(argc!=3)

    {

        printf("Usage:%s fromfile tofile !\n",argv[0]);

        exit(1);

    }

    //打开源文件

    if( (from_fd = open(argv[1],O_RDONLY | O_CREAT ))==-1)

    {

        printf("Open %s Error!\n",argv[1]);

        exit(1);

    }

    //创建目的文件

    if( (to_fd = open(argv[2], O_WRONLY | O_CREAT))==-1) 

    {

        printf("Open %s error! \n",argv[2]);

        exit(1);

    }

    //测得文件大小

    file_len=lseek(from_fd,0,SEEK_END);

    lseek(from_fd,0,SEEK_SET);

    printf("from file size is %d!\n",file_len);

    //进行文件拷贝

    while(ret)

    {

        ret = read(from_fd, buffer, BUFFER_SIZE);

        if(ret == -1)

        {

            printf("read error!\n");

            exit(1);

        }

        write(to_fd, buffer, ret );

        file_len = ret;

        bzero( buffer, BUFFER_SIZE );

    }

    printf("there are %d buyes data left without copy!\n",file_len);

    close(from_fd);

    close(to_fd);

    exit(0);

}

  

文件操作相关函数(POSIX 标准 open,read,write,lseek,close)的更多相关文章

  1. Yuchuan_linux_C 编程之八 文件操作相关函数

    一.整体大纲 st_mode整体介绍: st_mode详细介绍: 二. Linux文件操作相关函数 1. stat 作用:获得文件信息,也可以获取文件大小. 头文件 #include <sys/ ...

  2. Linux 文件操作——系统调用和标准I/O库

    一.什么是文件 在讲述文件操作之前,我们首先要知道什么是文件.看到这个问题你可能会感觉到可笑,因为对于用过计算机的人来说,文件是最简单不过的概念了,例如一个文本是一个文件,一个work文档是一个文件等 ...

  3. C语言文件操作相关函数

    在实际应用中,我们往往需要对文件进行操作,下面我将介绍C语言的一些关于操作文件的函数. 一.计算机文件 计算机文件是以计算机硬盘为载体存储在计算机上的信息集合,是存储在某种长期储存设备上的一段数据流. ...

  4. php 对文件操作相关函数

    1.fopen() :函数打开文件或者 URL.如果打开失败,本函数返回 FALSE. 2.fwrite() : 写入文件(可安全用于二进制文件);fwrite(file,string,length) ...

  5. 浅谈无缓存I/O操作和标准I/O文件操作差别

    首先,先略微了解系统调用的概念:        系统调用,英文名system call,每一个操作系统都在内核里有一些内建的函数库,这些函数能够用来完毕一些系统系统调用把应用程序的请求传给内核,调用对 ...

  6. 无缓存I/O操作和标准I/O文件操作区别

    本文转载于:http://www.360doc.com/content/11/0521/11/5455634_118306098.shtml 首先,先稍微了解系统调用的概念:       系统调用,英 ...

  7. 文件I/O和标准I/O

    转载:https://blog.csdn.net/kyang_823/article/details/79496561 一.文件I/O和标准I/O文件I/O:文件I/O也称为不带缓冲的I/O(unbu ...

  8. Linux文件操作学习总结【转载】

    本文转载自: http://blog.csdn.net/xiaoweibeibei/article/details/6556951 文件类型:普通文件(文本文件,二进制文件).目录文件.链接文件.设备 ...

  9. php基础知识--文件操作

    文件操作 文件 广义角度: 任何一个在磁盘上可以看到的符号(包含真正的文件及文件夹) 狭义角度: 真实存储数据的载体(不包含文件夹, 如doc文件,txt文件等) 文件操作: 对文件的增删改查 文件分 ...

随机推荐

  1. Python:Base4(map,reduce,filter,自定义排序函数(sorted),返回函数,闭包,匿名函数(lambda) )

    1.python把函数作为参数: 在2.1小节中,我们讲了高阶函数的概念,并编写了一个简单的高阶函数: def add(x, y, f): return f(x) + f(y) 如果传入abs作为参数 ...

  2. 记一次flannel调试

    今天发现k8s集群中不同Node上的pod不能互相ping通.调试了很长时间,发现是flannel的问题,记之. 问题一:对flannel backend的选择 flannel支持多种backend, ...

  3. python的I/O编程:文件打开、操作文件和目录、序列化操作

    1 文件读写 1.1 打开文件: open(r'D:\text.txt') 1.2 文件模式 值 功能描述 'r' 读模式 'w' 写模式 'a' 追加模式 'b' 二进制模式 '+' 读写模式 1. ...

  4. Postman接口测试:自动获取登录后的cookie并设置环境变量

    在对网站进行接口测试的时候,很多请求往往是需要带登录的cookie才能请求成功的,一般来说,可以用抓包软件(fiddler,浏览器的F12)来查看登录后的cookie,并把它设置到postman的环境 ...

  5. 抓包分析IP如何设置详细步骤

    首先,要知道的是,我们直接改以太网(校园网)的IP地址是不行的,校园网识别不了 如下图: 我们必须通过让电脑连接个人热点才能完成IP修改. 第一步,连接上热点后打开电脑的cmd命令程序,在命令窗口中输 ...

  6. mysql数据的备份

    一.备份方式 1.备份:逻辑备份(mysqldump,mydumper).物理备份(xtrabackup.tar.cp.rsync)    2.冗余:主备模式.数据库集群 二.备份对象 1.数据(库. ...

  7. CNN卷积汇总

    1,卷积作用:减少参数(卷积核参数共享),卷积过程中不断对上一个输出进行抽象,由局部特征归纳为全局特征(不同卷积层可视化可以观察到这点) 2,卷积核 早期卷积核由人工总结,如图像处理中有: 深度神经网 ...

  8. Opencv-python3.3版本安装

    因为目前为止(2019.11.17)opencv最新版本为4.1,因此直接pip install opencv-python的话,无法安装想要的版本(老师推荐3.X) 上清华镜像查找opencv-py ...

  9. hdfs(分布式文件系统)优缺点

    hdfs(分布式文件系统) 优点 支持超大文件 支持超大文件.超大文件在这里指的是几百M,几百GB,甚至几TB大小的文件.一般来说hadoop的文件系统会存储TB级别或者PB级别的数据.所以在企业的应 ...

  10. 再谈Java数据结构—分析底层实现与应用注意事项

    在回顾js数据结构,写<再谈js对象数据结构底层实现原理-object array map set>系列的时候,在来整理下java的数据结构. java把内存分两种:一种是栈内存,另一种是 ...