linux下的文件读写

1, open

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  • pathname:文件路径和名
  • flags
    • 必选项

      • O_RDONLY:只读
      • O_WRONLY:只写
      • O_RDWR:读写
    • 可选项
      • O_APPEND
      • O_CREAT
        • O_EXCL
        • mode:如果是创建文件,则必须指定文件的权限,最好算出来的权限:mode & ~umask
  • 返回值:返回最小的可用文件描述符,失败返回-1,并设置errno

例子:模拟touch命令

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> int main(int argc, char* argv[]){
int fd = open(argv[1], O_RDONLY|O_CREAT|O_EXCL, 0666);
close(fd);
return 0;
}

0666 & ~0002 = 0664,所以创建出来的文件的权限是:-rw-rw-r--

2,read

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);
  • fd:文件描述符
  • buf:读到哪里
  • conut:读多少个字节
  • 返回值
    • 失败返回-1,并设置errno
    • 如果文件描述符是非阻塞的时候,read不到的时候,返回值也是-1,这个-1不代表read失败,所以要判断errno的值,这时errno的值为【11】,用perror打印出的错误信息是【Resource temporarily unavailable】
    • 成功返回实际读到的字节数
    • 0代表读到文件的末尾了

3,write

#include <unistd.h>

ssize_t write(int fd, const void *buf, size_t count);
  • fd:文件描述符
  • buf:从哪里写
  • conut:写多少个字节
  • 返回值
    • 失败返回-1,并设置errno
    • 成功返回实际写出去的字节数
    • 0代表什么也没写进去

例子:模拟cat命令

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> int main(int argc, char* argv[]){
int fd = open(argv[1], O_RDONLY);
char buf[64] = {0};
int ret = 0; while((ret = read(fd, buf, sizeof buf)) > 0){
write(STDOUT_FILENO, buf, ret);
}
close(fd);
return 0;
}

4,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:文件描述符的末尾位置
  • 返回值
    • 成功:返回当前位置到开始位置的长度
    • 失败:返回-1,并设置errno

例子1:把字符串“helloworld”写入一个文件,然后读取这个文件,把“helloworld”从文件中读取出来,并打印到终端。

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h> int main(int argc, char* argv[]){
int fd = open(argv[1], O_RDWR|O_CREAT, 0666);
write(fd, "helloworld\n", 11); //这里必须使用lseek,来调整文件指针的位置,设置文件指针设置到文件的开始位置。
lseek(fd, 0, SEEK_SET);
char buf[20] = {0};
int ret = read(fd, buf, sizeof buf);
write(STDOUT_FILENO, buf, ret); close(fd);
return 0;
}

read和write的内幕:虽然read和write的参数里没有,文件指针所在位置的参数,但是,执行read或者write后,文件指针所在位置会被自动调整到:【当前位置+读入或者写入的字节数】的位置。

例子2:计算文件的大小

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h> int main(int argc, char* argv[]){
int fd = open(argv[1], O_RDWR); //open后,文件指针的位置在文件开头
//因为:lseek返回当前位置到开始位置的长度
//所以用lseek移动到了文件末尾,这时lseek的返回值就是文件的大小
int ret = lseek(fd, 0, SEEK_END);
printf("file size:%d\n", ret);
close(fd);
}

例子3:创建文件大小为1024的文件

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h> int main(int argc, char* argv[]){ int fd = open(argv[1], O_WRONLY|O_CREAT, 0666);
//打开后文件指针在文件的开始位置,然后从开始位置移动1023个字节,然后再调用write,
//注意不调用后面的write的话,创建的文件的大小是为0的。
lseek(fd, 1023, SEEK_SET);
write(fd, "a", 1);
close(fd); }

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

linux open write lseek的API和应用的更多相关文章

  1. Linux -- 基于zookeeper的java api(二)

    Linux -- 基于zookeeper的java api(二) 写一个关于基于集群的zookeeper的自定义实现HA 基于客户端和监控器:使用监控的方法查看每个注册过的节点的状态来做出操作. Wa ...

  2. Linux -- 基于zookeeper的java api(一)

    Linux -- 基于zookeeper的java api 首先启动你所有的 zkService.sh 查看状态:检查是否启动正确 [root@hu-hadoop2 ~]# zkServer.sh s ...

  3. Linux PWM framework简介和API描述【转】

    本文转载自:https://blog.csdn.net/mike8825/article/details/51656400 1. 前言 PWM是Pulse Width Modulation(脉冲宽度调 ...

  4. Linux内核 GPIO操作部分API

    内核中关于GPIO的操作API主要集中在<linux/of_gpio.h>和<linux/gpio.h>中,前者主要是GPIO直接与设备树相关的操作,在Linux 设备树操作A ...

  5. LInux内核分析--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    实验者:江军 ID:fuchen1994 实验描述: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3 ...

  6. Linux中断 - 驱动申请中断API

    一.前言 本文主要的议题是作为一个普通的驱动工程师,在撰写自己负责的驱动的时候,如何向Linux Kernel中的中断子系统注册中断处理函数?为了理解注册中断的接口,必须了解一些中断线程化(threa ...

  7. linux第5天 socket api

    IPv4套接口地址结构通常也称为“网际套接字地址结构”,它以“sockaddr_in”命名,定义在头文件<netinet/in.h>中 通用地址结构用来指定与套接字关联的地址.以socka ...

  8. Linux网络编程-----Socket地址API

    (1) 通用socket地址 socket网络编程接口中表示socket地址的是结构体sockaddr,其定义如下: #include<bits/socket.h> struct sock ...

  9. 20135239 益西拉姆 linux内核分析 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

    https://drive.wps.cn/preview#l/759e32d65654419cb765da932cdf5cdc 本次直接在wps上写的,因为不能连同图片一起粘贴过来,一个一个粘比较费时 ...

随机推荐

  1. RedisTemplate执行Redis脚本

    对于Redis脚本使用过的同学都知道,这个主要是为了防止竞态条件而用的.因为脚本是顺序执行的.(不用担心效率问题)比如我在工作用,用来设置考试最高分. 如果还没有用过的话,先去看Redis脚本的介绍, ...

  2. Nginx虚拟主机

    [root@Nginx-server ~]# tar zxvf nginx-1.11.2.tar.gz [root@Nginx-server ~]# useradd -M -s /sbin/nolog ...

  3. SSM-MyBatis-02:Mybatis最基础的增删改查(查全部和查单独一个)

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 继续上次的开始,这次记录的是增删改查,上次重复过的代码不做过多解释 首先先创建mysql的表和实体类Book ...

  4. Javascript 中的map/reduce

    先填个坑,后面慢慢填 附上一篇不错的文章:https://segmentfault.com/a/1190000008719824

  5. .NET Core 获取操作系统各种信息

    .NET Core 获取操作系统各种信息 一.前言 .NET Core 内置了一些API供我们获取操作系统.运行时.框架等信息.这些API不是很常用,所有有些小伙伴可能还不知道,这里做一些可能用到的获 ...

  6. python实现简单的一个刷票点赞功能

    投票网址:http://best.zhaopin.com/?sid=121128100&site=sou 在以上网址中找到"XXX技术有限公司",通过Python进行刷票. ...

  7. 把封装脚本做成jar包

    前提: eclipse, selenium, maven 把二次封装过的脚本做成jar包, 这样可以在新建工程里也调用封装过的方法. 实现步骤: 1. project 右键 => maven = ...

  8. watch.go

    package: } ,) ), ), ) ) , ];]]] :] ].Err()]:] ].Kv.ModRevision         w.resuming = append(w.resumin ...

  9. 【bzoj 3309 】 DZY Loves Math

    Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数a,b,求 ...

  10. BZOJ_1861_[Zjoi2006]Book 书架_splay

    BZOJ_1861_[Zjoi2006]Book 书架_splay 题意: 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在 ...