嵌入式Linux文件IO,read()/write()/lseek(),通过文件IO拷贝文件

本文深入探讨了Linux环境下文件操作的核心函数read、write和lseek的使用方法及示例代码。详细介绍了如何利用这些函数进行文件读取、写入及定位,包括示例代码展示如何使用read和write进行文件内容的读写,以及如何利用lseek调整文件读写位置。此外,还提供了一个使用read和write实现文件复制的完整示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,read()函数

#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);|

  1. 成功时返回实际读取的字节数; 出错时返回EOF
  2. 读到文件末尾时返回0
  3. buf是接收数据的缓冲区
  4. count不应超过buf大小

read()示例

从指定的文件(文本文件)中读取内容并统计大小

int main(int argc, char *argv[]) {
{
	int fd, n, total = 0;
	char buf[64];
	if (argc < 2) {
	printf(“Usage : %s <file>\n”, argv[0]); return -1;
}
if((fd = open(argv[1], O_RDONLY)) < 0) {
	perror(“open”); 
	return -1;
}
while ((n = read(fd, buf, 64)) > 0) {
	total += n;
}

2,write()函数

#include <unistd.h>
ssize_t write(int fd, void *buf, size_t count);

  1. 成功时返回实际写入的字节数; 出错时返回EOF
  2. buf是发送数据的缓冲区
  3. count不应超过buf大小

write()示例

将键盘输入的内容写入文件, 直到输入quit

int fd;
char buf[20];
if ((fd = open(argv[1], O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0) {
	perror(“open”); 
	return -1;
}
while (fgets(buf, 20, stdin) != NULL) {
	if (strcmp(buf, “quit\n”) == 0) 
		break;
	write(fd, buf, strlen(buf));
}

3,lseek()函数

#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);

  1. 成功时返回当前的文件读写位置; 出错时返回EOF
  2. 参数offset(偏移量)和参数whence(基准点)同fseek完全一样

4,通过文件IO,read()/write()拷贝文件

#include <stdio.h>//fprintf(),perror()
#include <fcntl.h>//open()
#include <errno.h>//errno
#include <string.h>//strerror()
#include <unistd.h>//read(),write(),close()

int my_cp_file(const char *src_file,const char *dst_file);
int main(int argc, const char *argv[])
{
	if(argc < 3)
	{
		printf("123456");
		fprintf(stdout,"usage:%s <src_file> <dst_feile>\n",argv[0]);
		return -1;
	}

	if(my_cp_file(argv[1],argv[2]) > -1)
	{
		printf("copy completed!\n");
	}
	else
	{
		fprintf(stdout,"copy defected!\n");
		return -1;
	}
	return 0;
}

int my_cp_file(const char *src_file,const char *dst_file)
{
	const int N = 64;
	int fds,fdt,n;
	char buf[N];

	if((fds = open(src_file,O_RDONLY)) < 0)
	{
		fprintf(stdout,"open %s : %s\n",src_file,strerror(errno));
		return -1;
	}
	if((fdt = open(dst_file,O_WRONLY|O_CREAT|O_TRUNC,0666)) < 0)
	{
		printf("open %s : %s\n:",dst_file,strerror(errno));
		return -1;
	}
	
	while((n = read(fds,buf,N)) >0)
	{
		write(fdt,buf,n);
	}

	close(fds);
	close(fdt);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值