文件IO *** 作

文件IO *** 作,第1张

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录
  • 文件I/O基础
  • open打开文件
    • 创建一个新文件
  • write写文件
  • read读文件
  • close关闭文件
  • lseek


文件I/O基础

1、文件描述符
调用open函数会有一个返回值,是一个int类型的数据,在open函数执行成功的情况下,会返回一个非负的整数,该返回值就是一个文件描述符(file descripor)。对于Linux内核来说,所有打开的文件都会通过文件描述符进行索引。
当调用open打开一个现有文件或者创建一个新文件时,内核都会向进程返回一个文件描述符,用于指向被打开的文件。当调用open、write函数进行文件读写时,会将文件描述符传给read、write函数。

open打开文件

在Linux系统中要 *** 作一个文件,需要先打开该文件,得到文件描述符号,然后再对文件进行相应的读写 *** 作。最后再关闭文件

创建一个新文件
int open(const char *pathname, int flags); 
int open(const char *pathname, int flags, mode_t mode);

open函数有两种原型,是可变参函数。调用open函数即可传入2个参数(pathname、flags)、也可传入3个参数(pathname、flags、mode),但是第三个参数mode需要在第二个参数flags满足条件时才会有效。
在应用程序中使用open函数时,需要包含3个头文件

#include 
#include 
#include 

函数参数和返回值含义:
pathname:字符串类型,用于标识需要打开或创建的文件,可以包含路径(绝对路径或相对路径)信息,譬如:“./src_file”(当前目录下的src_file文件)、"/home/dengtao/hello.c"等;如果pathname是一个符号链接,会对其进行解引用。
flags:调用open函数时需要提供的标志,包括文件访问模式标志以及其它文件相关标志,这些标志使用宏定义进行描述,都是常量,open函数提供了非常多的标志,我们传入flags参数时既可以单独使用某一个标志,也可以通过位或运算(|)将多个标志进行组合。

O_RDONLY——以只读方式打开文件
O_WRONLY——以只写方式打开文件
O_RDWR——以可读可写方式打开文件
举例说明:

open("./src_file", O_RDONLY) //单独使用某一个标志 
open("./src_file", O_RDONLY | O_NOFOLLOW) //多个标志组合

O_CREAT——如果pathname参数指向的文件不存在则创建此文件

(使用此标志时,调用open函数需要传入第3个参数mode,参数mode用于指定新建文件的访问权限,稍后将对此进行说明。
open函数的第3个参数只有在使用了O_CREAT或O_TMPFILE标志时才有效。)
mode:此参数用于执行新建文件的访问权限。在Linux中可以通过touch命令新建一个文件,此时文件会有一个默认的权限,如果需要修改文件权限,可以通过chmod命令对文件权限进行修改。
首先mode参数的类型是mode_t,这是一个u32无符号整形数据。
最高权限表示方法:111111111(二进制表示)、777(八进制表示)、511(十进制表示);

write写文件
#include  
ssize_t write(int fd, const void *buf, size_t count);

首先使用write函数需要先包含unistd.h头文件。
1、fd:文件描述符。关于文件描述符,前面已经给大家进行了简单地讲解,这里不再重述!我们需要将进行写 *** 作的文件所对应的文件描述符传递给write函数。
2、buf:指定写入数据对应的缓冲区。
3、count:指定写入的字节数。
返回值:如果成功将返回写入的字节数(0表示未写入任何字节),如果此数字小于count参数,这不是错误,譬如磁盘空间已满,可能会发生这种情况;如果写入出错,则返回-1。

特别的:一个很重要的问题是:从文件的哪个位置开始进行读写 *** 作?也就是IO *** 作所对应的位置偏移量,读写 *** 作都是从文件的当前位置偏移量处开始,当然当前位置偏移量可以通过lseek系统调用进行设置。默认情况下当前位置的偏移量一般是0,也就是指向了文件起始位置。当调用read、write函数读写 *** 作完成之后,当前位置偏移量也会向后移动对应字节数,譬如当前位置偏移量为1000个字节处,调用write()写入或read()读取500个字节之后,当前位置偏移量将会移动到1500个字节处。

read读文件
#include  
ssize_t read(int fd, void *buf, size_t count);

首先使用read函数需要先包含unistd.h头文件。
函数参数与write相同。
返回值:如果读取成功将返回读取到的字节数,实际读取到的字节数可能会小于count参数指定的字节数,也有可能会为0,譬如进行读 *** 作时,当前文件位置偏移量已经到了文件末尾。实际读取到的字节数少于要求读取的字节数,譬如在到达文件末尾之前有30个字节数据,而要求读取100个字节,则read读取成功只能返回30;而下一次再调用read读,它将返回0(文件末尾)。

close关闭文件
#include  
int close(int fd);

返回值:如果成功返回0,如果失败则返回-1。
除了使用close函数显式关闭文件之外,在Linux系统中,当一个进程终止时,内核会自动关闭它打开的所有文件,也就是说在我们的程序中打开了文件,如果程序终止退出时没有关闭打开的文件,那么内核会自动将程序中打开的文件关闭。很多程序都利用了这一功能而不显式地用close关闭打开的文件。
显式关闭不再需要的文件描述符往往是良好的编程习惯,会使代码在后续修改时更具有可读性,也更可靠,进而言之,文件描述符是有限资源,当不再需要时必须将其释放、归还于系统。

lseek
#include  
#include  
off_t lseek(int fd, off_t offset, int whence);

首先调用lseek函数需要包含两个头文件。
函数参数和返回值含义如下:
fd:文件描述符。
offset:偏移量,以字节为单位。
whence:用于定义参数offset偏移量对应的参考值,该参数为下列其中一种(宏定义):
SEEK_SET:读写偏移量将指向offset字节位置处(从文件头部开始算);
SEEK_CUR:读写偏移量将指向当前位置偏移量 + offset字节位置处,offset可以为正、也可以为负,如果是正数表示往后偏移,如果是负数则表示往前偏移;
SEEK_END:读写偏移量将指向文件末尾 + offset字节位置处,同样offset可以为正、也可以为负,如果是正数表示往后偏移、如果是负数则表示往前偏移。
返回值:成功将返回从文件头部开始算起的位置偏移量(字节为单位),也就是当前的读写位置;发生错误将返回-1。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1498591.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存