linux 文件I/O编程 必须掌握的5个基础函数:open( );read( );write( ); lseek( );close( );

open ( ) :打开文件

头文件:fcntl.h

函数原型: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_CREAT:	如果改文件不存在,就创建一个新的文件,并用第三个参数为其设置权限
O_EXCL:		如果使用O_CREAT时文件存在,则返回错误消息。这一参数可测试文件是否存在。此时open是原子操作,防止多个进程同时创建同一个文件
O_NOCTTY:	使用本参数时,若文件为终端,那么该终端不会成为调用open()的那个进程的控制终端
O_TRUNC:	若文件已经存在,那么会删除文件中的全部原有数据,并且设置文件大小为0
O_APPEND:	以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾
O_NONBLOCK: 如果pathname指的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选择项为此文件的本次打开操作和后续的I/O操作设置非阻塞方式。
O_SYNC:		使每次write都等到物理I/O操作完成。
O_RSYNC:	read 等待所有写入同一区域的写操作完成后再进行

                mode:被创建的文件权限,例如 0777 ,一般在搭配O_CREAT 参数时使用。

返回值:成功打开 返回一个非负整数;

                失败 返回 -1

例子

open ("C:/Desktop/test.c, O_RDWR | O_CREAT, 0777);

read( ) :从文件中读取数据;

头文件:unistd.h

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

参数说明:fd:open 返回的文件描述符;

                  buf:指缓冲区,即读取的数据会被放到这个缓冲区中去;

                  count:指定一次read多少个字符;

返回值:返回所读取的字节数 ;

              0(读到EOF);

             -1(出错)

例子

read (fs, buf, sizeof(buf)

write( ):向文件写数据;

头文件:unistd.h

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

参数说明:fd:open 返回的文件描述符;

                  buf:数据会从buf 缓冲区写到 fd 指定的文件中;

                  count:每次写多少个字节;

返回值:成功:返回写入文件的字节数,

               失败:-1;

例子

write(fd, buf, strlen(buf));

lseek( ):用于在指定的文件描述符中将将文件指针定位到相应位置。

头文件:unistd.h  sys/types.h

函数原型:off_t lseek(int fd, off_t offset,int whence);

参数说明:fd:open 返回的文件描述符;

                  offset :偏移量,每一读写操作所需要移动的距离,单位是字节,可正可负。

                  whence:当前的位置基点;

                                SEEK_SET:当前位置为文件开头;

                                SEEK_CUR:当前位置为文件指针的位置;

                                SEEK_END:当前位置为文件的末尾;

返回值:成功,返回当前文件指针位置距文件开头的位移,即多少个字节,常常利用将文件指针置于文件末尾来计算文件大小;

                失败:-1;

例子

lseek (fd, 0, SEEK_END);

close():用于关闭一个被打开的的文件

头文件:unistd.h

函数原型:int close (int fd);

参数说明: fd :文件描述符;

返回值:成功:0 ;

              失败:-1;

例子

close(fd);

综合例子:

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

int main() {
	char *path1 = "C:/Desktop/main.c";
	char *path2 = "C:/Desktop/2.txt";
	char buf[1024] = {0};
	int count = 0 ; 
	int pos;
	//open()打开要读取的源文件;
	int fs = open(path1, O_RDONLY);
	if ( fs < 0){
		perror ("打开文件 path1 失败");
		return -1;
	} 
	pos = lseek(fs, 0, SEEK_CUR);
	printf("打开path1 时文件指针位置为:%d\n",pos);
	//打开要写入的目的文件; 
	int fd = open (path2, O_WRONLY|O_CREAT);
	if ( fd < 0){
		perror ("打开文件 path2 失败");
		return -1;
	}
	
	// 复制打开的的源文件内容到新的文档中;
	while (count = read (fs, buf, sizeof(buf)) > 0){
		write(fd, buf, strlen(buf)); 
		pos = lseek(fs, 0, SEEK_CUR);
		pos += count;
		lseek(fs, pos, SEEK_SET);
		printf("read后文件指针位置为:%d\n",pos);
		
	}
	 close(fs);
	 close(fd);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值