本文内容主要讲解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;
}