嵌入式Linux标准IO,拷贝文件fgetc()/fputc(),fread()/fwrite()

1,按字符输入fgetc(),getc(),getchar()

下列函数用来输入一个字符:
#include <stdio.h>
int fgetc(FILE *stream);
int getc(FILE *stream);
int getchar(void);

  1. 成功时返回读取的字符; 若到文件末尾或出错时返回EOF
  2. getchar()等同于fgetc(stdin)

2,按字符输出fputc(),putc(),putchar()

下列函数用来输出一个字符:
#include <stdio.h>
int fputc(int c, FILE *stream);
int putc(int c, FILE *stream);
int putchar(int c);

  1. 成功时返回写入的字符; 出错时返回EOF
  2. putchar©等同于fputc(c, stdout)

3,通过fgetc()/fputc()拷贝文件

#include <stdio.h>
#include <errno.h>
#include <string.h>

int get_file_size(const char *file);
int my_write_file_char(const char *file,const char *mode,char ch);
int my_cp_file(const char *src_file,const char *dst_file,const char *mode);

int main(int argc, const char *argv[])
{
	int ch;

	if(argc <3)
	{
		printf("usage:%s <src_file> <dst_file>\n",argv[0]);
		return -1;
	}
	printf("src_total %d bytes\n",get_file_size(argv[1]));
	ch = fgetc(stdin);
	my_write_file_char(argv[1],"w",ch);

	printf("src_total %d bytes\n",get_file_size(argv[1]));

	ch ='a';
	while(ch <= 'z')
	{
		my_write_file_char(argv[1],"a+",ch);
		ch++;
	}	
	printf("src_total %d bytes\n",get_file_size(argv[1]));

	printf("dst_total %d bytes\n",get_file_size(argv[2]));
	my_cp_file(argv[1],argv[2],"w");
	printf("dst_total %d bytes\n",get_file_size(argv[2]));
	
	return 0;
}

int get_file_size(const char *file)
{
	int count=0;
	FILE *fp;
	if((fp = fopen(file,"r")) == NULL)
	{
		perror("get_size_fopen");
		//printf("fopen:%NULLs\n",strerror(errno));//errno-----<errno.h>,strerror()------<string.h>
		return -1;
	}
		
	while(fgetc(fp) != EOF)
	{
		count ++;
	}
	
	if(fclose(fp) == EOF)
	{
		perror("_get_size_fclose");
		return EOF;
	}
	
	return count;
}

int my_write_file_char(const char *file,const char *mode,char ch)
{
	FILE *fp;
	if((fp = fopen(file,mode)) == NULL)
	{
		perror("write_file_char_fopen");
		//printf("fopen:%NULLs\n",strerror(errno));//errno-----<errno.h>,strerror()------<string.h>
		return -1;
	}
		
	fputc(ch,fp);

	if(fclose(fp) == EOF)
	{
		perror("fclose");
		return EOF;
	}
	
}
int my_cp_file(const char *src_file,const char *dst_file,const char *mode)
{
	char ch;
	FILE *src_fp,*dst_fp;
	if((src_fp = fopen(src_file,"r")) == NULL)
	{
		perror("src_fopen");
		return -1;
	}
	if((dst_fp = fopen(dst_file,mode)) == NULL)
	{
		perror("dst_fopen");
		return -1;
	}

	while((ch = fgetc(src_fp)) != EOF)
	{
		fputc(ch,dst_fp);
	}

	if(fclose(src_fp) == EOF)
	{
		perror("src_fclose");
		return EOF;
	}
	if(fclose(dst_fp) == EOF)
	{
		perror("dst_fclose");
		return EOF;
	}
	
}

运行结果

在这里插入图片描述

通过fread()/fwrite()拷贝文件

int my_cp_file(const char *src_file,const char *dst_file,const char *mode)
{
	const int N = 64;
	char buf[N];
	int n = 0;
	FILE *src_fp,*dst_fp;
	if((src_fp = fopen(src_file,"r")) == NULL)
	{
		perror("src_fopen");
		return -1;
	}
	if((dst_fp = fopen(dst_file,mode)) == NULL)
	{
		perror("dst_fopen");
		return -1;
	}
	//size_t fread(void *ptr,size_t size,size_t n,FILE *fp);
	//size为要读写的流的对象的大小(单位:字节),如:int是4,char是1
	while((n = fread(buf,1,N,src_fp)) > 0)
	{
		fwrite(buf,1,n,dst_fp);//buf空间为N(64字节),但源文件中不一定有N个字节数据,此处写入实际读出的字节数
	}

	if(fclose(src_fp) == EOF)
	{
		perror("src_fclose");
		return EOF;
	}
	if(fclose(dst_fp) == EOF)
	{
		perror("dst_fclose");
		return EOF;
	}	
}

运行结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37542524/article/details/83616635
今日推荐