文件操作编程一(open、close、read、write、lseek函数的使用)

一、open()函数用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数

所需头文件:#include <sys/types.h> /* 提供类型pid_t 的定义 */

#include <sys/stat.h>

#include <fcntl.h>

函数原型:int open(const char *pathname, int flags, int perms)

函数传入值:pathname 被打开的文件名(可包括路径名)

flag:文件打开的方式

O_RDONLY:以只读方式打开文件
O_WRONLY:以只写方式打开文件
O_RDWR:以读写方式打开文件
O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限
O_EXCL:如果使用O_CREAT 时文件存在,则可返回错误消息。这一参数可测试文件是否存在。此时open 是原子操作,防止多个进程同时创建同一个文件
O_NOCTTY:使用本参数时,若文件为终端,那么该终端不会成为调用open()的那个进程的控制终端
O_TRUNC:若文件已经存在,那么会删除文件中的全部原有数据,并且设置文件大小为0。
O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾
perms:被打开文件的存取权限
可以用一组宏定义:S_I(R/W/X)(USR/GRP/OTH)
其中R/W/X 分别表示读/写/执行权限
USR/GRP/OTH 分别表示文件所有者/文件所属组/其他用户
例如,S_IRUSR | S_IWUSR 表示设置文件所有者的可读可写属
性。八进制表示法中600 也表示同样的权限
函数返回值:成功:返回文件描述符
失败:-1


二、close()函数用于关闭一个被打开的文件。当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件

所需头文件:#include <unistd.h>

函数原型:int close(int fd)

函数输入值:fd:文件描述符

函数返回值 :0:成功
-1:出错


三、read()函数用于将从指定的文件描述符中读出的数据放到缓存区中,并返回实际读入的字节数。若返回0,、则表示没有数据可读,即已达到文件尾。读操作从文件的当前指针位置开始。当从终端设备文件中读出数据时,通常一次最多读一行

所需头文件:#include <unistd.h>

函数原型:ssize_t read(int fd, void *buf, size_t count)

函数传入值:fd:文件描述符
buf:指定存储器读出数据的缓冲区
count:指定读出的字节数
函数返回值:

成功:读到的字节数
0:已到达文件尾
-1:出错


四、write()函数用于向打开的文件写数据,写操作从文件的当前指针位置开始。对磁盘文件进行写操作,若磁盘已满或超出该文件的长度,则write()函数返回失败。

所需头文件: #include <unistd.h>

函数原型:ssize_t write(int fd, void *buf, size_t count)

函数传入值:fd:文件描述符
buf:指定存储器写入数据的缓冲区
count:指定读出的字节数
函数返回值:
成功:已写的字节数
-1:出错


五、lseek()函数用于在指定的文件描述符中将文件指针定位到相应的位置。它只能用在可定位(可随机访问)文件操作中。管道、套接字和大部分字符设备文件是不可定位的,所以在这些文件的操作中无法使用lseek()、调用

所需头文件:#include <unistd.h>
#include <sys/types.h>
函数原型:off_t lseek(int fd, off_t offset, int whence)

函数传入值:fd:文件描述符
offset:偏移量,每一读写操作所需要移动的距离,单位是字节,可正可负(向前移,向后移)
whence:当前位置的基点
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小

函数返回值:
成功:文件的当前位移
-1:出错


函数使用举例:

#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>


int main()
{
int src_file, dest_file;
unsigned char buff[1024];
int real_read_len;


src_file = open("src_file", O_RDONLY);

dest_file = open("dest_file",O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if (src_file < 0 || dest_file < 0)
{
printf("Open file error\n");
exit(1);
}

lseek(src_file, -100, SEEK_END);

while ((real_read_len = read(src_file, buff, sizeof(buff))) > 0)
{
write(dest_file, buff, real_read_len);
}
close(dest_file);
close(src_file);

return 0;
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值