exercise25

1. 研究
sscanf
sprintf
面向控制台标准输入输出的scanf printf
面向字符串的输入输出函数sscanf sprintf
面向文件的流的输入输出函数fscanf fprintf
sprintf函数原型
 int sprintf(char *str,const char *format,...)
 作用:格式化字符串
 1、将数字变量转化为字符串
     sprintf(str, "%d", 12345); //->"12345"
 2、得到整形变量的8进制和16进制字符串
    sprintf(str,"0%o",12345);
    sprintf(str,"0x%X",12345);
 3、连接多个字符串
    sprintf(str,"%s %s",s1,s2);
sscanf函数原型
 int sscanf(const char *str,const char *format,...)
 作用:将参数str的字符串根据参数format字符串来转换并格式化数据,转换后的结果存于对应的参数内。
 1、根据格式从字符串中提取数据。如提取出整数、浮点数和字符串等。
 2、取指定长度的字符串
 3、取到指定字符为止的字符串
 4、取仅包含指定字符集的字符串
 5、取到指定字符集为止的字符串
     const char *str = "http://www.baidu.com:1234";
     sscanf(str,"%[^:]://%[^:]:%[1-9]",str1,str2,str3);
 1、-: 表示范围,如:%[1-9]表示只读取1-9这几个数字 %[a-z]表示只读取a-z小写字母,类似地 %[A-Z]只读取大写字母
 2、^: 表示不取,如:%[^1]表示读取除'1'以外的所有字符 %[^/]表示除/以外的所有字符
 3、,: 范围可以用","相连接 如%[1-9,a-z]表示同时取1-9数字和a-z小写字母
2.研究
fread
fwrite  专门处理二进制
fread函数原型
 size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
fwrite函数原型
 size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream);
fwrite参数
 1、要写入的数据地址,二进制无类型
 2、一次写入的基本单位
 3、写入几个基本单位
 4、从哪里写
fread参数
 1、要读的数据放在哪里,指向缓冲区
 2、读的基本单位
 3、要读多少个基本单位
 4、要从哪里读入

例如实现拷贝命令,支持文本和二进制,源文件以二进制方式打开

#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)

int main(int argc, char *argv[])
{
	if (argc != 3){
		printf("Usage:%s src dst\n",argv[0]);
		return 1;
	}
	FILE *srcp = fopen(argv[1], "rb");
	if (!srcp){
		perror("fopen");
		goto end;
	}
	FILE *dstp = fopen(argv[2], "wb");
	if (!dstp){
		perror("fopen");
		goto end;
	}
	//获取文件大小
	fseek(srcp, 0, SEEK_END);
	long size = ftell(srcp);
	rewind(srcp);

	char *buf = (char *)malloc(size);
	if (!buf){
		perror("malloc");
		goto end;
	}
	fread(buf, 1, size, srcp);//直接获得整个文件大小,读入内存
	fwrite(buf, 1, size, dstp);//将整个文件写入硬盘

end:
	if (srcp){
		fclose(srcp);
		srcp = NULL;
	}
	if (dstp){
		fclose(dstp);
		dstp = NULL;
	}
	if (buf){
		free(buf);
		buf = NULL;
	}

}



猜你喜欢

转载自blog.csdn.net/zn_wuxunian/article/details/80685701