linux系统下的文件I/O操作
来源:互联网 发布:淘宝买宠物狗 编辑:程序博客网 时间:2024/05/22 08:35
对于文件操作,标准C库与linux各有自己的一套体系。并且在linux环境下两种体系都可以完成对文件的操作,在这里我们不介绍标准C库文件操作集,主要说明linux下的文件I/O集合。其实两种体系文件操作方式大体类似。主要涉及打开文件、读文件、写文件等。
在linux系统中大多数文件I/O只需要用到5个函数:open read write lseek 以及close。creat函数经常被open整合使用并不经常单独使用。
在讲函数之前,先介绍文件描述符的概念,所谓文件描述符就是文件的‘身份证’,对于内核而言,所有打开的文件都通过文件描述符引用。文件描述符是一个非负整数。当代开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。当读、写一个文件时,使用open或creat返回的文件描述符标识改文件,将作为参数传送给read或write。
文件操作基本流程,打开(创建-》打开)文件-》定位-》读、写操作-》关闭文件
1、creat()创建文件函数
巧妇难为无米之炊,没有文件,也就没有进一步操作,creat属于‘造米’函数,首先看一下creat函数结构。
#include <fcnt1.h>int creat(const char *path,mode_t mode);返回值:创建文件成功返回该文件描述符,创建失败返回-1.
第一个参数path:要打开或创建文件的名字,可以跟路径。没有路径时默认当前所在路径创建文件。
第二个参数mode:为创建文件的权限,可用数字规定其权限 RWX--421 规定所有者 所属组 其他人的权限
创建一个名字为test.txt的文件用法如下:
#include <fcnt1.h>int main(void){int pdpd= creat("test.txt",755);exit(0);}
2、open()打开文件函数
函数作用是打开文件
open函数结构
#include <fcnt1.h>int open(const char *path,int oflag);int open(const char *path,int oflag,mode_t mode);我们可以看到open函数有两个,这是为什么呢?这根open函数的第二个参数flag有关,先介绍一下open函数结构
返回值:同creat函数一致,为打开文件的文件描述符。
参数一path:要打开的文件的文件名,可跟路径,没有路径时默认当前所在路径读取文件。
参数二oflag:该函数的选项,可以是多个选项,选项之间用 | 连接,下面列出一些选项:
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 可读可写打开
O_EXEC 只打开
上面列出的四个选项只能用一个不能用 | 连接。下面列出可选常量
O_APPEND 每次写时都追加到文件的尾端
O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志
O_CREAT 此文件不存在时,创建它,这时候open函数就需要第三个参数来追加创建文件的权限,这也就是为什么open函数既有两个参数的也有三个参数的原因。
O_DIRCTORY 如果path引用的不是目录则出错
O_EXCL 如果和O_CREAT同时使用并且创建的文件已经存在,则出错,可验证创建的文件是否存在。如果不存在则创建此文件。
O_NOCTTY 如果path引用的是终端设备,则不将该设备分配作为此进程的控制终端
O_NOFOLLOW 如果path引用的是一个符号链接,则出错
O_NONBLOCK 如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续IO操作设置为非阻塞式。
O_SYNC 更新文件IO操作至物理硬盘
O_TRUNC 如果此文件存在,并且只写或读写方式成功打开,将长度阶段为0
O_TTY_INIT 如果打开一个还未打开的终端设备,设置非标准termios参数值,使其符合Single UNIX Specification。
O_DSYNC 使每次write要等待物理IO操作完成,但是如果该写操作并不影响读取刚写入的数据,则不需要等待文件属性被更新。
O_RSYNC 使每一个以文件描述符作为参数进行的read操作等待,直至所有对文件同一部分挂起的写操作都完成
如果创建一个test.txt的文件可以这样使用
#include <fcnt1.h>int main(void){ int pd pd= open("test.txt",O_RDWR|O_CREAT,755); exit(0);}
3、close()关闭文件函数
函数作用是关闭打开的文件
closet函数结构如下:
#include <unistd.h>int close (int fd)返回值:若关闭成功则返回0,失败返回-1
参数:文件描述符
4、lseek()定位函数
函数作用可理解为定位光标位置,在操作world时我们只有把光标移动到相应位置,才能对相应位置的内容进行操作,此函数功能类似,打开一个文件时默认光标位置在文件初始位置,写操作完成后光标在最末尾,若想验证读写操作,向文件写入内容后,一定要将光标位置移动到写入的内容之前,否则读时,读出的内容往往为空,查看文件时文件里却存在写入的内容。
lseek函数结构如下
#include <unistd.h>off_t lseek(int fd,off_t offset,int whence);返回值:若成功返回偏移量,失败返回-1
参数一fd:文件描述符
参数二offset:光标偏移量
参数三whence:文件参考位置
有三个选项:SEEK_SET 将文件偏移量设置于文件开始处offset个字节
SEEK_CUR 将文件偏移量设置于文件当前位置offset个字节
SEEK_END 将文件偏移量设置于文件结尾处offset个字节
5、write()函数
作用是向文件写入内容
write函数结构
#include <unistd.h>ssize_t write(int fd,const void*buf,size_t nbyte);返回值:成功返回实际写入的字节数,失败返回-1
参数一fd:文件描述符
参数二指针:空类型的文件指针,可以是任意类型,数据 汉字 字符等。此部分是向文件写入的内容
参数三nbyte:向文件写入的数据大小,如果写入内容实际小于第三个参数,返回值则为实际写入的字节数量
6、read()函数
作用是从文件读出内容
read函数结构与write函数类似
#include <unistd.h>ssize_t read(int fd,const void*buf,size_t nbyte);返回值:成功则返回实际读取的字节数,失败返回-1
参数一fd:文件描述符
参数二指针:空类型的文件指针,可以是任意类型,数据 汉字 字符等。此部分主要是向定义的指针空间内部存储读出的文件内容
参数三nbyte:从文件读出的数据大小,如果读出内容实际小于第三个参数,返回值则为实际读出的字节数量
最后列出一个综合的小程序:
#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int main(int argc,char *argv[]){ int fd; char buffer[100]; fd=open(argv[1],O_CREAT|O_RDWR,755); write(fd,"I LOVE LI",50); lseek(fd,0,SEEK_SET); read(fd,buffer,50); printf("读取的数据是:%s\r\n",buffer); close(fd); return 0;}
运行结果如下:
[root@localhost file]# makegcc -o file file.c./file zhang.txt读取的数据:I LOVE LIls一下
[root@localhost file]# lsfile file.c makefile zhang.txtzhang.txt已将存在当前目录,接下来看一下是否将内容写入
[root@localhost file]# lsfile file.c makefile zhang.txt[root@localhost file]# more zhang.txt I LOVE LI[root@localhost file]#内容存在创建的文件中
编译时为了方便采用了makefile,内容很简单如下
file:file.c gcc -o $@ $^ ./$@ zhang.txtlinux文件操作暂时说到这里。
- Linux系统下的文件I/O操作
- linux系统下的文件I/O操作
- Linux下的I/O操作
- linux的文件 I/O操作
- linux 下的文件I/O方式
- linux下I/O操作
- Linux文件I/O操作
- Linux文件I/O操作
- Linux下的文件操作(不带缓存的I/O操作)
- linux系统调用与文件I/O操作
- linux系统调用与文件I/O操作
- linux系统调用与文件I/O操作
- Linux 系统编程学习-文件I/O操作
- linux系统编程之文件与I/O(三):目录的操作
- linux系统编程之文件与I/O(三):目录的操作
- linux系统编程之文件与I/O(三):目录的操作
- Linux系统编程学习笔记(1)-文件的I/O操作
- linuxC系统编程——文件的I/O操作
- ue4 杂记
- mysql查找重复记录中指定最大(最小)值
- JavaScript基础之箭头函数
- java生成文件的默认保存路径与System.getProperty("user.dir")
- java 导入excle
- linux系统下的文件I/O操作
- 《PHP和MySQL WEB开发》第四章笔记
- react绑定事件
- InstantClient安装使用
- java.util.HashMap中的key为对象的问题,对象key获得相应的value值
- iOS_身份证号码校验
- 德国启用含有RFID芯片的新型身份证
- ACM单词拼接
- UVA 120Stacks of Flapjacks