linux系统编程笔记:文件编程
1.创建文件:
创建文件可以使用Linux系统调用create,其原型为:int creat(const char*filename,mode_t mode)
filename:你要创建的文件名(包含路径,缺省为在当前路径下创建文件)
mode_t:创建模式,表示你创建的文件的权限。
S_IRUSR 可读
S_IWUSR 可写
S_IXUSR 可执行
S_IRWXU 可读可写可执行
也可以直接用数字来表示,比如mode_t取0666时表示创建的文件对于文件所有者和文件所有者所在的组以及其他人都是可读可写的。
注:实际貌似很少用creat系统调用来创建文件,因为系统调用open不仅具备打开一个文件的功能同时也具备创建一个文件的功能。
2.打开(创建)文件:
打开或创建文件可以使用系统调用open,其原型有两种形式:
第一种形式(纯粹打开文件):int open(const char*pathname,int flags)
第二种形式(同时具备打开文件和创建文件的功能):int open(const char*pathname,int flags,mode_t mode)
pathname:你需要打开的文件名,包含路径,缺省情况下为打开当前路径下的文件。
flags:打开标志
O_RDONLY 只读方式打开文件
O_WRONLY 只写方式打开文件
O_RDWR 读和写的方式打开文件
O_APPEND 追加方式打开文件,打开文件时文件的指针指向被打开文件的末尾,将写入的内容添加到文件的末尾
O_CREAT 如果要打开的文件不存在时,则创建一个新文件,并用第三个参数mode_t来指定创建的文件的权限
O_NOBLOCK 非阻塞方式打开文件
使用open系统调用打开一个文件之后会返回一个文件描述符fd,这个fd为一个非负整数,每一个被打开的文件都对应着唯一一个fd,你可以把fd理解成为被打开文件的***号码,以后要对这个文件进行其他操作时,都是使用这个fd。
open调用成功时返回被打开文件的文件描述符,失败时返回-1 。
注:使用open系统调用需要包含如下头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
3.关闭文件:
当不需要对打开的文件进行其他操作了的时候,我们需要使用close这个系统调用来关闭该文件,close系统调用的原型为:
int close(int fd),其中fd为文件描述符
close调用成功时返回0,失败时返回-1 。
注:使用close系统调用需要包含的头文件:
#include <unistd.h>
4.读文件:
读取文件内容使用read系统调用,其原型为int read (int fd,const void*buf,size_t length)
fd:文件描述符,表示你要读取哪个文件
buf:缓冲区,读取文件后的内容就被放到这个缓冲区
length:你要读取的字节数
函数功能:从文件描述符fd所对应的文件中读取length个字节到缓冲区buf中,然后read完后返回实际从文件中所读取的字节数,若read失败则返回0或-1,0表示文件的读取指针已经到了文件尾部导致无法从文件中读取内容,-1表示读取出错。
使用read系统调用应包含的头文件:
#include <unistd.h>
5.写文件:
写文件使用write系统调用,其原型为 int write(int fd,const void*buf,size_t length)
fd:文件描述符,表示你要对哪个文件进行写操作。
buf:缓冲区,你要写被写文件的数据来源,即你要写进某个文件的数据是从这个缓冲区里取的。
length:写入文件的字节数。
函数功能:从buf缓冲区里取length个字节的数据,然后把这些数据写进fd所对应的文件中,write完后返回实际写入文件的字节数,若write失败,则返回-1。
使用write系统调用应该包含的头文件:
#include <unistd.h>
6.定位文件指针的位置:
我们使用read或者write对文件进行读和写操作的时候,都是默认从当前的文件指针处开始read和write,那么假设我现在要对一个文件里最后100个字节处开始进行读或者写操作,这个时候你就必须把文件的指针移到指定的位置,然后才能进行正确的读或写了。
定位文件指针的位置用lseek系统调用,其原型为:
int lseek(int fd,offset_t offset,int whence)
fd:文件描述符,表示你要对哪个文件的指针进行定位和移动。
offset:文件指针相对于原来的位置移动的距离,也就是偏移量。
whence:文件指针原来的位置,也就是你要进行文件指针移动的基准点。
函数功能:将文件的指针相对于基准点whence移动offset个字节,若lseek成功则返回文件指针相对于文件头的位置,若失败,则返回-1 。
使用lseek系统调用需要包含的头文件:
#include <unistd.h>
#include <sys/types.h>
7.文件访问判断:
有时候我们需要判断文件是否可以进行某种操作(读或写等等),这时候可以使用系统调用access,其原型为:
int access(const char*pathname,int mode)
pathname:文件名称(包含路径,缺省为当前路径),表示你要对哪个文件进行判断。
mode:要判断的访问权。
R_OK 文件可读
W_OK 文件可写
X_OK 文件可执行
F_OK 文件存在
当测试成功时,返回0,否则返回-1 。
使用access系统调用需要包含的头文件:
#include <unistd.h>
本文出自 “止不住的思考” 博客,请务必保留此出处http://9110091.blog.51cto.com/9100091/1605159
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。