linux c学习笔记08--文件操作
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--文件操作的更多相关文章
- Linux系统学习笔记:文件I/O
Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...
- python学习笔记(三):文件操作和集合
对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 文件基本操作: f = open('file.txt','r') #以只读方式打开一个 ...
- Java 学习笔记(14)—— 文件操作
java文件操作主要封装在Java.io.File中,而文件读写一般采用的是流的方式,Java流封装在 java.io 包中.Java中流可以理解为一个有序的字符序列,从一端导向到另一端.建立了一个流 ...
- python学习笔记之文件操作(三)
这篇博客小波主要介绍一下python对文件的操作 对文件的操作主要分为三步: 1.打开文件获取文件的句柄,句柄也是文件描述符 2.通过文件句柄操作文件 3.关闭文件. 现有以下文件,是小波随写的周杰伦 ...
- node 学习笔记 - fs 文件操作
本文同步自我的个人博客:http://www.52cik.com/2015/12/03/learn-node-fs.html 最近看到群里不少大神都开始玩 node 了,我感觉跟他们步伐越来越大了, ...
- python学习笔记三 文件操作(基础篇)
文件操作 打开文件 open(name[,mode[,buffering]]) open函数使用一个文件名作为强制参数,然后返回一个文件对象.[python 3.5 把file()删除掉] w ...
- python的学习笔记01_5文件操作
一,文件操作基本流程. 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众 ...
- node学习笔记3——文件操作fs
文件操作关键字: http('fs') —— 请求 node 里面的 http 模块 readFile —— 读文件,参数包括 文件名,回调函数 writeFile —— 写文件,参数包括 文件 ...
- Python学习笔记 - day5 - 文件操作
Python文件操作 读写文件是最常见的IO操作,在磁盘上读写文件的功能都是由操作系统提供的,操作系统不允许普通的程序直接操作磁盘(大部分程序都需要间接的通过操作系统来完成对硬件的操作),所以,读写文 ...
- python学习笔记4(文件操作)
文件操作: 1.f=open(”caidan”,”w”,encoding=”utf8”) 直接打开一个文件,如果文件不存在则创建文件 f.close() 2.with open (”caid ...
随机推荐
- du 使用详解 linux查看目录大小 linux统计目录大小并排序 查看目录下所有一级子目录文件夹大小 du -h --max-depth=1 |grep [
常用命令 du -h --max-depth=1 |grep [TG] |sort #查找上G和T的目录并排序 du -sh #统计当前目录的大小,以直观方式展现 du -h --max-d ...
- 在Eclipse中使用JUnit4进行单元测试(高级篇)
通过前2篇文章,您一定对JUnit有了一个基本的了解,下面我们来探讨一下JUnit4中一些高级特性. 一.高级Fixture 上一篇文章中我们介绍了两个Fixture标注,分别是@Before和@Af ...
- java.lang.ClassCastException: com.bjsxt.registration.model.User_$$_javassist_0 cannot be cast to javassist.util.proxy.Proxy
1.懒加载 因为此时用的load懒加载机制,到jsp页面在发送sql语句的时候session已经关闭了.所以会报以上错.可以添加过滤器,使session在请求响应完成后再关闭. 过滤器要配置在stru ...
- printf 整数类型都用 uint8_t
#include <iostream> #include <string> #include <tuple> #include <utility> ...
- The project: project which is referenced by the classpath, does not exist.
有个java工程运行时报The project: project which is referenced by the classpath, does not exist.错误 上网查解决方案,说是将 ...
- virtualBox 打开旧的ubuntu虚拟机镜像时找不到网卡的解决方法
一 环境: ubuntu v8.04 virtualbox _v4.3 二 操作 1 按正常创建新的虚拟机, 然后在选择虚拟硬盘界面选择使用旧的ubuntu虚拟机 2 打开虚拟机 删除/etc/ude ...
- (Collection)350. Intersection of Two Arrays II
/* Given two arrays, write a function to compute their intersection. Example: Given nums1 = [1, 2, 2 ...
- MySql增删改查命令
5.1 创建数据表 命令:create table <表名> ( <字段名1> <类型1> [,..<字段名n> <类型n>]); 例如,建 ...
- 【摘】 pt-query-digest工具一解
原文 http://blog.csdn.net/seteor/article/details/24017913 1.percona-toolkit安装 wget http://www.percona. ...
- 【VB6】VB6实现拖拽
首先,设置OLEDropMode OLEDropMode = 1 然后插入代码 Private Sub 控件名_OLEStartDrag(Data As DataObject, AllowedEffe ...