1 . 创建
int creat(const char *filename, mode_t mode);
参数 mode 指定新建文件的存取权限,它同 umask 一起决定文件的最终权限( mode&umask),
其中 umask 代表了文件在创建时需要去掉的一些存取权限。 umask 可通过系统调用 umask()来改变:
int umask(int newmask);
该调用将 umask 设置为 newmask,然后返回旧的 umask,它只影响读、写和执行权限。
2. 打开
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
open()函数有两个形式,其中 pathname 是我们要打开的文件名 ( 包含路径名称,缺省是认为
在当前路径下面), flags 可以是如下 所示的一个值或者是几个值的组合。

文件打开标志

标 志 含 义

O_RDONLY

以只写的方式打开文件

O_WRONLY

以只读的方式打开文件

O_RDWR

以读写的方式打开文件

O_APPEND

以追加的方式打开文件

O_EXEC

如果使用了 O_CREAT 而且文件已经存在,就会发生一个错误

O_CREAT

创建一个文件

O_NOBLOCK

以非阻塞的方式打开一个文件

O_TRUNC

如果文件已经存在,则删除文件的内容

O_RDONLY、 O_WRONLY、 O_RDWR 三个标志只能使用任意的一个。
如果使用了 O_CREATE 标志,则使用的函数是 int open(const char *pathname,int flags,mode_tmode); 这个时候我们还要指定 mode 标志,用来表示文件的访问权限。

Linux用 5 个数字来表示文件的各种权限:第一位表示设置用户 ID;第二位表示设置组 ID;第三位表示用户自己的权限位;第四位表示组的权限;最后一位表示其他人的权限。每个数字可以取 1(执
行权限)、 2(写权限)、 4(读权限)、 0(无)或者是这些值的和。例如,要创建一个用户可读、可写、可执行,但是组没有权限,其他人可以读、可以执行的文件,并设置用户 ID 位。那么,
我们应该使用的模式是 1 (设置用户 ID)、 0(不设置组 ID)、 7( 1+2+4,读、写、执行)、 0(没有权限)、 5( 1+4,读、执行)

即 10 705:open("test", O_CREAT, 10 705);
上述语句等价于:
open("test", O_CREAT, S_IRWXU | S_IROTH | S_IXOTH | S_ISUID );
如果文件打开成功, open 函数会返回一个文件描述符,以后对该文件的所有操作就可以通过
对这个文件描述符进行操作来实现。
3. 读写
在文件打开以后,我们才可对文件进行读写, Linux 中提供文件读写的系统调用是 read、 write
函数:
int read(int fd, const void *buf, size_t length);
int write(int fd, const void *buf, size_t length);
其中 参数 buf 为指向缓冲区的指针, length 为缓冲区的大小(以字节为单位)。函数 read()实
现从文件描述符 fd 所指定的文件中读取 length 个字节到 buf 所指向的缓冲区中,返回值为实际读
取的字节数。函数 write 实现将把 length 个字节从 buf 指向的缓冲区中写到文件描述符 fd 所指向
的文件中,返回值为实际写入的字节数。
以 O_CREAT 为标志的 open 实际上实现了文件创建的功能,因此,下面的函数等同 creat()函数:
int open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
4. 定位
lseek()将文件读写指针相对 whence 移动 offset 个字节。操作成功时,返回文件指针相对于文
件头的位置。参数 whence 可使用下述值:
SEEK_SET:相对文件开头
SEEK_CUR:相对文件读写指针的当前位置
SEEK_END:相对文件末尾
offset 可取负值,例如下述调用可将文件指针相对当前位置向前移动 5 个字节:
lseek(fd, -5, SEEK_CUR);
由于 lseek 函数的返回值为文件指针相对于文件头的位置,因此下列调用的返回值就是文件
的长度:
lseek(fd, 0, SEEK_END);
5. 关闭
当我们操作完成以后,我们要关闭文件了,只要调用 close 就可以了,其中 fd 是我们要关闭
的文件描述符:
int close(int fd);

linux c学习笔记08--文件操作的更多相关文章

  1. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  2. python学习笔记(三):文件操作和集合

    对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 文件基本操作: f = open('file.txt','r') #以只读方式打开一个 ...

  3. Java 学习笔记(14)—— 文件操作

    java文件操作主要封装在Java.io.File中,而文件读写一般采用的是流的方式,Java流封装在 java.io 包中.Java中流可以理解为一个有序的字符序列,从一端导向到另一端.建立了一个流 ...

  4. python学习笔记之文件操作(三)

    这篇博客小波主要介绍一下python对文件的操作 对文件的操作主要分为三步: 1.打开文件获取文件的句柄,句柄也是文件描述符 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件,是小波随写的周杰伦 ...

  5. node 学习笔记 - fs 文件操作

    本文同步自我的个人博客:http://www.52cik.com/2015/12/03/learn-node-fs.html 最近看到群里不少大神都开始玩 node 了,我感觉跟他们步伐越来越大了, ...

  6. python学习笔记三 文件操作(基础篇)

    文件操作 打开文件 open(name[,mode[,buffering]])   open函数使用一个文件名作为强制参数,然后返回一个文件对象.[python 3.5 把file()删除掉]   w ...

  7. python的学习笔记01_5文件操作

    一,文件操作基本流程. 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...

  8. node学习笔记3——文件操作fs

    文件操作关键字: http('fs') ——  请求 node 里面的 http 模块 readFile ——  读文件,参数包括 文件名,回调函数 writeFile ——  写文件,参数包括 文件 ...

  9. Python学习笔记 - day5 - 文件操作

    Python文件操作 读写文件是最常见的IO操作,在磁盘上读写文件的功能都是由操作系统提供的,操作系统不允许普通的程序直接操作磁盘(大部分程序都需要间接的通过操作系统来完成对硬件的操作),所以,读写文 ...

  10. python学习笔记4(文件操作)

    文件操作: 1.f=open(”caidan”,”w”,encoding=”utf8”)      直接打开一个文件,如果文件不存在则创建文件 f.close() 2.with open (”caid ...

随机推荐

  1. 错误: 未能从 xmlsocket://127.0.0.1:5840 中加载策略文件

    看看你是否使用了MonsterDebugger,如果是这样的话, 因为那个 MonsterDebugger 没有启动 删掉MonsterDebugger的代码吧

  2. BestCoder Round #90 A.Kblack loves flag(随机数生成种子)

    A.Kblack loves flag [题目链接]A.Kblack loves flag [题目类型]水题 &题意: kblack喜欢旗帜(flag),他的口袋里有无穷无尽的旗帜. 某天,k ...

  3. Oracle补习班第五天

    Great minds have purpose,others have wishes. 杰出的人有着目标,其他人只有愿望 控制文件是小型二进制文件,只能在mount阶段新建 1,重做控制文件 alt ...

  4. easyUI+mvc权限管理后台

    通过按钮和菜单,组合成基本的功能,菜单的功能可以编码修改,但浏览功能是菜单基本的入口,只有角色赋予了浏览功能,才能访问. 基本按钮表 菜单模块 菜单分配按钮 角色授权 下面是对一张表的基本操作 模型 ...

  5. i2c 读写

    在I2C设备读取,必须是在同一个周期内. 一个例子,可以同时读出两个值 int read_register_double_value(int reg_addr, unsigned char *valu ...

  6. vrrp

    https://zhidao.baidu.com/question/1498182981731748379.html

  7. Java 如何将String转化为Int

    在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换. 例1: 1 2 3 4 5 6 S ...

  8. python中的thread

    转载自: http://blog.sina.com.cn/s/blog_9f488855010198vn.html 正确与否未验证 python中得thread的一些机制和C/C++不同:在C/C++ ...

  9. Apache配置文件服务器

    配置Apache文件服务器: apache配置文件服务器httpd.conf中这两个模块必须不被注释LoadModule autoindex_module modules/mod_autoindex. ...

  10. DELL PowerEdge 2950更换告警硬盘

    硬盘为SAS300G15K,四块,3#告警,打算还掉,在R900上找到一块对应的硬盘直接换下. 进入控制台后发现硬盘阵列里还是只有三块硬盘,物理磁盘倒是有四块,新插上的一块状态为“外部”,其他状态是“ ...