1. 程式人生 > >嵌入式Linux檔案IO,read()/write()/lseek(),通過檔案IO拷貝檔案

嵌入式Linux檔案IO,read()/write()/lseek(),通過檔案IO拷貝檔案

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;
}