C语言文件IO(嵌入式系统课程学习记录3)


这次学的主要是linux系统下c语言的io编程

文件IO

open函数

open函数的定义如下:

int open(const char * pathname, int flags);
int open(const char * pathname, int flags, mode_t mode);

其中返回值为文件描述符,如果打开失败则返回-1

第一个参数pathname是字符串,输入打开文件的路径
第二个参数flags是标志位,多个组合用 | 隔开
第三个参数mode,在用creat标志的时候要写上权限

感觉上能用标志的如下:

标志含义
O_RDONLY只读
O_WRONLY只写
O_RDWR读写
O_APPEND写入时在后面追加
O_CREAT若不存在则创建
······

close函数

close函数的定义如下:

int close(int fd);

使用方法很简单,返回值0表示成功,返回-1表示失败。
fd是之前open()的返回值,表示关闭打开的某文件。

和open()成对使用

read函数

定义:

ssize_t read(int filedes, void *buf, size_t nbytes);

返回值表示读到的大小,如果是-1表示失败
第一个参数filedes是open返回的文件描述符
第二个参数表示要读到的缓存区
第三个参数表示读取的长度

write函数

定义:

ssize_t write(int filedes, const void *buf, size_t nbytes);

与read类似:
返回值表示写入的大小,-1表示失败
第一个参数是open返回的文件描述符
第二个参数是写入的缓存区
第三个是写入的字节数

基于文件IO的文件拷贝程序

#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
#include "string.h"
int main(int argc,char *argv[]){
	int rd_fd,wr_fd;
	char read_buf[128] = {0};
	int rd_ret = 0;
	if(argc < 3){
		printf("Please input src file and dst file \n");
		return -1;
	}
	rd_fd = open(argv[1],O_RDONLY);
	if(rd_fd < 0){
		printf("open src file %s error\n",argv[1]);
		return -2;
	}
	printf("open src file %s success, rd_fd = %d\n",argv[1],rd_fd);
	wr_fd = open(argv[2],O_WRONLY|O_CREAT,0600);//不存在就创建,权限0600
	if(wr_fd < 0){
		printf("open dst file %s error\n",argv[2]);
		return -3;
	}
	printf("open dst file %s success, wr_fd = %d\n",argv[2],wr_fd);
	while(1){
		rd_ret = read(rd_fd,read_buf,128);
		if(rd_ret < 128){
			break;	
		}
		write(wr_fd,read_buf,rd_ret);
		memset(read_buf,0,128);
	}
	write(wr_fd,read_buf,rd_ret);
	close(rd_fd);
	close(wr_fd);
	return 0;
}

标准IO

标准io是"stdio.h"定义的一系列函数,也有关于文件的IO函数,优势是移植性比文件IO好。

fopen函数

fopen()与open()类似

FILE * fopen(const char * path,const char * mode);

返回参数是FILE指针,NULL表示失败
第一个参数path是文件名
第二个参数mode是读写规则

mode含义
r只读
w只写(覆盖),不存在就创建
w+读写(覆盖),不存在就创建
a只写(追加),不存在就创建
a+读写(追加),不存在就创建
(b)对应的二进制文件,例如wb+表示二进制读写覆盖
······

fclose函数

类似close()

int fclose(FILE *stream)

返回值0表示成功,-1表示失败
参数stream是打开的FILE指针

fread函数

类似read(),但是顺序有变

size_t fread(void *buffer, size_t size, size_t count, FILE *stream);

返回值是读取的长度,-1表示失败
buffer:是读取到的缓存位置,数据去向
size:是读取的大小
count:表示数据个数,一般用1
stream:是fopen()返回的指针

fwrite函数

类似write(),顺序有变

size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);

返回值是写入的大小
buffer:写入数据的缓存位置,数据来源
size: 大小
count: 个数,一般是1
stream:文件指针,fopen()打开的

基于标准IO的文件拷贝程序

其中的注释是和上一个程序的差异

#include "stdio.h"
#include "unistd.h"
#include "fcntl.h"
#include "string.h"

int main(int argc,char *argv[]){
	//int rd_fd,wr_fd;
	FILE *rd_fd,*wr_fd;

	char read_buf[128] = {0};
	int rd_ret = 0;
	if(argc < 3){
		printf("Please input src file and dst file \n");
		return -1;
	}
	//rd_fd = open(argv[1],O_RDONLY);
	rd_fd = fopen(argv[1],"r");
	//if(rd_fd < 0){
	if(rd_fd == NULL){
		printf("open src file %s error\n",argv[1]);
		return -2;
	}
	printf("open src file %s success, rd_fd = %d\n",argv[1],rd_fd);
	//wr_fd = open(argv[2],O_WRONLY|O_CREAT,0600);
	wr_fd = fopen(argv[2],"w");
	//if(wr_fd < 0){
	if(wr_fd==NULL){
		printf("open dst file %s error\n",argv[2]);
		return -3;
	}
	printf("open dst file %s success, wr_fd = %d\n",argv[2],wr_fd);

	while(1){
		//rd_ret = read(rd_fd,read_buf,128);
		rd_ret=(int)fread(read_buf,1,128,rd_fd);

		if(rd_ret < 128){
			break;
		}
		//write(wr_fd,read_buf,rd_ret);
		fwrite(read_buf,1,rd_ret,wr_fd);
		memset(read_buf,0,128);
	}
	//write(wr_fd,read_buf,rd_ret);
	fwrite(read_buf,1,rd_ret,wr_fd);
	fclose(rd_fd);
	fclose(wr_fd);
	close(rd_fd);
	close(wr_fd);
	return 0;
}

暂时就这样

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值