文件描述符:
在Linux系统中,所有打开的文件也对应一个数字,这个数字由系统来分配,我们称之为:文件描述符。文件描述符的名字通常定义为fd。数据类型为int。
打开文件:
函数原形:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
函数功能:
打开或创建一个文件。
所属头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
返回值:
打开文件成功,返回文件描述符;打开失败,返回-1。
参数说明:
pathname:指明要打开文件的文件名,含有文件名的路径字符串
flags:文件打开的标志,有三种flag 必须要包含一个O_RDONLY,O_WRONLY,O_RDWR,其他的可以选择,多个参数使用位或(|)符号,其中有两个常用:
O_APPEND:以追加方式打开文件,写入的数据跟在已有数据之后。
O_CREAT:打开的文件不存在时,可以创建所需的文件。
mode:仅在flags中使用了O_CREAT标志时一定要使用, mode记录了打开文件的权限。例如:0742,7代表了创建者的权限,4代表了用户的权限,2代表了其他人的权限。
创建文件
函数原形:
int creat(const char *pathname, mode_t mode);
函数功能:
创建文件,并以只写的方式打开该文件。
所属头文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
返回值:
打开文件成功,返回文件描述符;打开失败,返回-1。
参数说明:
pathname:指明要打开文件的文件名,含有文件名的路径字符串
modes:创建文件的读写权限。creat函数相当于使用了参数O_CREAT | O_WRONLY |O_TRUNC的open函数。使用了creat就必须使用modes。
关闭文件
函数原形:
int close(int fd)
函数功能:
关闭一个打开的文件
所属头文件:
#include <unistd.h>
返回值:
关闭成功返回0,关闭失败返回-1.
参数说明:
fd:待关闭的文件的文件描述符。
读文件
函数原形:
ssize_t read(int fd, void *buf, size_t count);
函数功能:
从指定的文件描述符对应的文件中读取数据。
所属头文件:
#include <unistd.h>
返回值:
读取成功,返回读取的字节数。读取失败,返回-1.
参数说明:
fd:要读取的文件的描述符。
count:最多读取的字节数,希望读取的字节数。
buf:读取来的数据存储位置的首地址,buf指向读取来的数据。
写文件
函数原形:
ssize_t write(int fd, const void *buf, size_t count);
函数功能:
向一个打开的文件写入数据。
所属头文件:
#include <unistd.h>
返回值:
若写入成功,返回写入的数据的字节数。若失败,返回-1
参数说明:
fd:要写入的文件的描述符。
count:最多写入的字节数,希望写入的字节数。
buf:写入的数据存储位置的首地址,buf指向要写入的数据。
定位文件
函数原形:
off_t lseek(int fd, off_t offset, int whence);
函数功能:
重新定位所打开的文件的文件读写指针的位置。打开一个文件时,除非设置O_APPEND属性,否则指针指向文件开始位置。
所属头文件:
#include <sys/types.h>
#include <unistd.h>
返回值:
若操作成功,则返回现在的读写指针位置,以距离文件开始处的字节数来表示。若操作失败,返回-1.
参数说明:
fd:打开文件的描述符。
offset:所需要的读写指针的位置偏移,若为正数则向后移,若为负数则向前移。
whence:以下三种选一种:
SEEK_SET:将指针位置设置为offset的位置。
SEEK_CUR:将指针位置设置为当前位置加上offset的位置。
SEEK_END:将指针位置设置为文件结尾加上offset的位置。
举例:lseek(fd, 0, SEEK_SET);//设置到开头位置
复制文件描述符
函数原形:
int dup(int oldfd);
函数功能:
复制一个文件描述符,返回当前可用文件描述符中的最小数值。
所属头文件:
#include <unistd.h>
返回值:
成功返回新的文件描述符,失败则返回-1.
参数说明:
oldfd:被复制的老的文件描述符。
例程:
例程1:复制文件
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void main(int argc, char **argv)
//main的参数意义:像cp函数一样,运行时第一个参数为源文件,第二个为目标文件。
{
int fd_s, fd_d;
int count = 0;
char buf[512];
/* 打开源文件 */
fd_s = open(argv[1], O_RDONLY);
/* 打开目标文件 */
fd_d = open(argv[2], O_RDWR | O_CREAT, 0755);
/* 读取源文件数据,并将源文件中的数据写到目标文件中 */
while((count = read(fd_s, buf, 512)) > 0)
if (count < 512)
write(fd_d, buf, count);
else
write(fd_d, buf, 512);
/* 关闭源文件和目标文件 */
close(fd_s);
close(fd_d);
}
例程2:各个函数的用法
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
void main()
{
//打开文件
int fd;
int fd_new;
int close_result;
char buf_write[10] = "1234567890";
char buf_read[10];
fd = open("./test.c", O_RDWR | O_CREAT, 0755);
if (fd < 0)
printf("open fail.\n");
else
printf("the descriptor is %d, open successfully.\n", fd);
/*
//关闭文件
close_result = close(fd);
if (close_result < 0)
printf("close fail.\n");
else
printf("close successfully\n");
*/
//写入文件
write(fd,buf_write, 10);
printf("write over.\n");
//定位文件中读写指针的位置
lseek(fd, 0, SEEK_SET);
//复制文件描述符
fd_new = dup(fd);
//读取文件
read(fd_new, buf_read, 5);
buf_read[5] = '\0';
printf("buffer is %s.\n", buf_read);
close(fd);
}