Linux C read、write、creat、open等函数应用实例

      本文内容主要讲解Linux C read、write、creat、open等函数的应用实例,包括:

  • 打开文件
  • 循环读取文件所有内容
  • 循环将大文本写入文件
  • 拷贝文件

头文件:io_basic.h

/*
 * io_basic.h
 *
 *  Created on: 2015年7月20日
 *      Author: alex
 */

#ifndef IO_BASIC_H_
#define IO_BASIC_H_

/*
 ============================================================================
 Name        : IO_Operation.c
 Author      : 王玉春
 Version     :
 Copyright   : 禁止用于商业行为
 Description : Hello World in C, Ansi-style
 ============================================================================
 */
//以O_RDWR | O_CREAT | O_TRUNC,S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH权限打开文件
int open_file(const char* filename);
//以O_RDWR | O_CREAT | O_TRUNC,S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH权限打开文件
int open_file_create(const char* filename) ;
//以O_RDONLY,S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH权限打开文件
int open_file_rd(const char* filename) ;
//创建文件
int create_file(const char* filename) ;
//读取文件
void read_file(const char* filename) ;
//写入文件
void write_file(const char* filename) ;
//拷贝文件
void cp_file(const char * src_file, const char * des_file) ;

#endif /* IO_BASIC_H_ */

文件主体:io_basic.c

/*
 ============================================================================
 Name        : IO_Operation.c
 Author      : 王玉春
 Version     :
 Copyright   : 禁止用于商业行为
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

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

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

#include "util.h"
#include "io_basic.h"

const char* filename = "resources/test.txt";
const char* filename2 = "resources/test2.txt";

int open_file(const char* filename) {
	return open_file_create(filename);
}

int open_file_create(const char* filename) {
	int fd; //文件描述符

	//O_WRONLY	只写
	//O_RDONLY	只读
	//O_RDWR		读写
	//S_IRUSR(S_IREAD)	文件拥有者具备读权限
	//S_IWUSR(S_IWRITE)	文件拥有者具备写权限
	//S_IXUSR(S_IEXEC)	文件拥有者具备可执行权限
	//S_IRGRP	用户组具备读权限
	//S_IWGRP	用户组具备写权限
	//S_IXGRP		用户组具备可执行权限
	//S_IROTH	其他用户具备读权限
	//S_IWOTH	其他用户具备写权限
	//S_IXOTH		其他用户具备可执行权限
	fd = open(filename, O_RDWR | O_CREAT | O_TRUNC,
			S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH);

	//判断文件是否操作成功,-1表示操作失败
	if (fd == -1) {
		printf("\nopen_file:文件操作失败");
		return -1;
	}

	printf("\nopen_file:文件操作成功");

	return fd;
}

int open_file_rd(const char* filename) {
	int fd; //文件描述符

	//O_WRONLY	只写
	//O_RDONLY	只读
	//O_RDWR		读写
	//S_IRUSR(S_IREAD)	文件拥有者具备读权限
	//S_IWUSR(S_IWRITE)	文件拥有者具备写权限
	//S_IXUSR(S_IEXEC)	文件拥有者具备可执行权限
	//S_IRGRP	用户组具备读权限
	//S_IWGRP	用户组具备写权限
	//S_IXGRP		用户组具备可执行权限
	//S_IROTH	其他用户具备读权限
	//S_IWOTH	其他用户具备写权限
	//S_IXOTH		其他用户具备可执行权限
	fd = open(filename, O_RDONLY,
			S_IWUSR | S_IRUSR | S_IWGRP | S_IRGRP | S_IROTH);

	//判断文件是否操作成功,-1表示操作失败
	if (fd == -1) {
		printf("\nopen_file:文件操作失败");
		return -1;
	}

	printf("\nopen_file:文件操作成功");

	return fd;
}

int create_file(const char* filename) {
	int fd;	//文件描述符

	fd = creat(filename, 0664);

	//判断文件是否操作成功,-1表示操作失败
	if (fd == -1) {
		printf("\ncreate_file:文件操作失败");
		return -1;
	}

	printf("\ncreate_file:文件操作成功");

	return fd;
}

void read_file(const char* filename) {
	int fd = open_file(filename);

	//打印文件描述符
//	printf("\nread_file.fd = %d", fd);

	//缓存数组
	char buf[255];
	//单次从文件读取到的字符长度
	ssize_t rNum = 0;

	printf("\nrNum:%d", rNum);

	//读取文件中所有内容
	while (rNum = read(fd, buf, RD_UNIT_SIZE)) {
		printf("\n---------------------------------------");

		if (rNum == -1) {
//			if (errno == EINTR){
//				continue;
//			}

			printf("\nread_file文件操作失败");
			close(fd);
			return;
		} else {
			if (rNum > 0) {
				//文件读取成功
			} else {
				//文件读取完毕,到达文件结尾EOF
			}
		}

	}

	printf("\n文件读取完毕,打印文件内容:\n");

//	int i;
//	for (i=0; i<GET_ARRAY_LEN(buf); i++){
//		printf("%c", buf[i]);
//	}

	printf("文件内容:%s", buf);

	close(fd);
}

void write_file(const char* filename) {
	char buf[] =
			"while ((wNum = write(fd, buf_pointer, 2)) && tNum<GET_ARRAY_LEN(buf)-1)中文{dfsdafdsawe823uik";

	int fd = open_file(filename);

	//打印文件描述符
	printf("\nread_file.fd = %d", fd);

	//单次写入到文件的字符长度
	ssize_t wNum = 0;
	//已经写入文件的总字符长度
	ssize_t tNum = 0;

	char *buf_pointer = buf + tNum;

	printf("\nGET_ARRAY_LEN(buf)=%d", GET_ARRAY_LEN(buf));

	//读取文件中所有内容
	while ((wNum = write(fd, buf_pointer, WR_UNIT_SIZE))
			&& tNum < GET_ARRAY_LEN(buf) - 1) {
//		printf("\n---------------------------------------");

		if (wNum == -1) {
			printf("\nwrite_file文件操作失败");
			close(fd);
			return;
		} else {
			if (wNum > 0) {
				//文件写入成功

				tNum += wNum;
				buf_pointer += wNum;

//				printf("\ntNum=%d, wNum=%d", tNum, wNum );
			} else {
				//文件写入完毕
			}
		}
	}

	printf("\n文件写入完毕\n");

	close(fd);
}

void cp_file(const char * src_file, const char * des_file) {
	int fd_src = open_file_rd(src_file);
	int fd_des = open_file_create(des_file);

	//打印文件描述符
	//	printf("\nread_file.fd = %d", fd);

	//缓存数组
	char buf[RDWR_UNIT_SIZE];
	//单次从文件读取到的字符长度
	ssize_t rNum = 0;

//		printf("\nrNum:%d", rNum);
	printf("开始拷贝文件:\n");

	//读取文件中所有内容
	while (rNum = read(fd_src, buf, RDWR_UNIT_SIZE)) {
		printf(".");

		if (rNum == -1) {
			//			if (errno == EINTR){
			//				continue;
			//			}

			printf("\ncy_file文件操作失败");
			close(fd_src);
			return;
		} else {
			if (rNum > 0) {
				//文件读取成功,将读取的内容写入目标文件
				ssize_t wNum = write(fd_des, buf, RDWR_UNIT_SIZE);

				if (wNum == -1) {
					printf("\ncp_file文件操作失败");
					close(fd_des);
					return;
				} else {
					if (wNum > 0) {
						//文件写入成功
					} else {
						//文件写入完毕
					}
				}
			} else {
				//文件读取完毕,到达文件结尾EOF
			}
		}

	}

	printf("\n文件拷贝完毕\n");

	close(fd_src);
	close(fd_des);
}

int main(void) {
	puts("Linux I/O操作"); /* prints Linux I/O操作 */

//	write_file(filename2);
//	cp_file(filename, filename2);
	create_file("test3.txt");//("resources/test_createfile.txt");

	return EXIT_SUCCESS;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值