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 LI
ls一下

[root@localhost file]# lsfile  file.c  makefile  zhang.txt
zhang.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.txt
linux文件操作暂时说到这里。





原创粉丝点击