前言
对文件的操作一定要按照打开文件,操作文件,关闭文件的顺序。其中关闭文件最重要。因为文件本身是静态文件,打开文件后会创建动态文件,静态文件的内容就会载到动态文件的buf缓冲区内,对文件的操作都是对buf进行操作。如果不关闭文件就不会同步更新静态文件,关闭文件后就会同步更新静态文件。
目录
本文讲述Linux下对文件的操作常使用的一些函数:open()函数、close()函数、write()函数、
read()函数、lseek()光标定位函数,以及一些出现的小问题。
open()
close()
write()
read()
creat()
open()
头文件:
#include#include #include
函数原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:打开一个文件,会返回一个文件描述符——整型数(file description简称fd),文件描述符贯 穿所有文件操作函数,其他函数可以根据fd来对指定的文件进行访问。
参数说明:
1.pathname
需要打开的文件名字(要包含路径)
2.flags
打开文件的时候,对文件的访问权限,可以传入一个或者两个参数选项。
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 可读可写打开
这三个参数使用时有且只能使用一个(很好理解,你不能可读可写的时候又让它只写)
O_CREAT 若文件不能存在则创建。使用此选项时,需要同时说明第三个参数 mode,用其说明新文件的访问权限。 若文件不存在则创建它。
O_EXCL 如果指定了O_CREAT|O_EXCL,返回值是-1的话说明文件存在
O_APPEND 加上这个参数就可以使得每次写入的东西换行写入下一行中
O_TRUNC 加上这个参数就可以把之前的内容清除重新写入最新内容
open()函数的使用要根据应用场景不同来决定使用哪一个,若文件存在就使用第一个,若不存在就是用第二个,flag里需要使用 O_CREAT(例如O_RDWR|O_CREAT),mode记录带创建的文件访问权限。
返回值:
打开成功:返回一个整型数
打开失败:返回-1
close()
头文件:
#include
函数原型:
int close(int fd);
功能:关闭打开的一个文件。
参数说明:
fd是open函数返回的文件描述符。
返回值:
关闭成功:返回0
关闭失败:返回-1
注意:打开的文件一定要关闭,否则大量资源被占用,导致内存不够。
write()
头文件:
#include
函数原型:
ssize_t write(int fd, const void *buf, size_t count);
功能:往fd所指的文件中写入内容。白话解释就是取缓冲区buf放的数据count字 节,写入到打开 的文件中。
参数说明:
1.int fd
文件描述符,open函数成功打开后返回的数。
2.const void *buf
无类型的指针,缓冲区用来存放你要写入的内容。
3.size_t count
写入文件的字节数,将缓冲区的数据要写入多少字节。
返回值:
写入成功:返回一个整型数
写入失败:返回-1
read()
头文件:
#include
函数原型:
ssize_t read(int fd, void *buf, size_t count);
功能:从fd所指的文件中,读取内容。白话解释就是从fd指的文件中,读出count字节的数据 存放在buff中。
注:定义buf时要注意野指针的问题,要为buf开辟空间。
参数说明:
1.int fd
文件描述符,open函数成功打开后返回的数。
2.const void *buf
无类型的指针,缓冲区用来存放你要读出的内容。
3.size_t count
读出文件的字节数,将文件中的数据要读出多少字节存放在缓冲区。
返回值:
读取成功:返回读取的字节数(空白文件返回值为0)
读取失败:返回值是-1
read函数问题:读文件的时候一定要确保文件的光标到了首位,不然读取将会是空白。这里解释一下:
假设给空白文件写入上面的内容,文件的光标就会到达f后,read的时候是从光标后面开始读,因此读出来的内容就会是空白的。此光标类似word文档打完字后面闪烁的那个光标。
解决方法:
1.重新打开。写入成功后关闭文件,再打开文件即可使光标到首位。
close(fd);
fd = open("./file1",O_RDWR);
2.重新定位光标。利用lseek函数重新定位光标。
lseek(int fd, offset, int whence);
1.文件: #include
#include
2.参数说明:fd:文件描述符
offset:偏移值(光标正数往后移,负数往前移)相对于光标位置的偏移量
int whence:光标位置,它有三种类型:
SEEK_SET光标指向头部,
SEEK_CUR光标指向当前位置,
SEEK_END光标指向尾部
3.lseek函数可以巧妙的计算文件内容的大小:
int filesize = lseek(fd,0,SEEK_END);
creat()
头文件:
#include#include #include
函数原型:
int creat(const char *pathname, mode_t mode);
功能说明:创建一个文件
参数说明:
1.const char *pathname 创建的文件的存放路径
2.mode_t mode 给创建的文件赋予权限,可以使用一下几个
宏表示 数字 S_IRUSR 4 可读 S_IWUSR 2 可写 S_IXUSR 1 可执行 S_IRWXU 7 可读、写、执行
返回值:
返回此文件的文件描述符fd。



