每日一C:在工作目录内复制自身

  • 2017-09-30
  • 205
  • 0
  • 0

复制自身,并随机文件名,运行克隆体可以继续克隆>….

  1. 今天用到了随机数,
  2. main的argv[0]是当前执行的exe文件名,其中包含该文件的路径名
  3. 使用文件操作函数:
  • fread() 的原型为:
size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );

ptr 用于接收数据的内存地址
size 要读的每个数据项的字节数,单位是字节
count 要读count个数据项,每个数据项size个字节.
fp 输入流

它返回成功读写的块数,该值小于等于 count。如果我们让参数 size 等于1,那么返回的就是读取的字节数。

  • fwrite() 的原型为:
size_t fwrite (const void* buffer, size_t size, size_t count, FILE* stream );

返回值:返回实际写入的数据块数目
(1)buffer:是一个指针,对fwrite来说,是要获取数据的地址;
(2)size:要写入内容的单字节数;
(3)count:要进行写入size字节的数据项的个数;
(4)stream:目标文件指针;
(5)返回实际写入的数据项个数count。

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>                                               /* 使用当前时钟做种子 */
int main( int argc, char *argv[] )
{
	/* printf("%s", argv[0]); */
	FILE	*fpRead;                                        /* 读文件 */
	FILE	*fpWrite;                                       /* 写文件 */
	int	bufferlen	= 1024 * 4;                     /* 缓冲区长度 */
	char	*buffer		= (char *) malloc( bufferlen ); /* 开辟缓存 */
	int	readCount;                                      /* 实际读取数 */

	/* 随机文件名 */
	srand( (unsigned) time( NULL ) );                       /* 初始化随机数 */
	char	fileName[100]	= { 0 };
	int	rc		= rand();
	sprintf( fileName, "%d.exe", rc );

	if ( (fpRead = fopen( argv[0], "rb" ) ) == NULL || (fpWrite = fopen( fileName, "wb" ) ) == NULL )
	{
		printf( "打开文件失败!" );
		getch();
		exit( 1 );
	}
	/* 不断从fileRead读取内容,放在缓冲区,再将缓冲区的内容写入fileWrite */
	while ( (readCount = fread( buffer, 1, bufferlen, fpRead ) ) > 0 )
		fwrite( buffer, readCount, 1, fpWrite );

	free( buffer );
	fclose( fpRead );
	fclose( fpWrite );

	/* getch(); */
	return(0);
}

参考文章:

随机数

文件复制

 

 

日期:2017年9月30日

评论

偷偷告诉你,这还毛都没有 T T

发表评论