★★用 C 标准库写了个"文件复制"程序,可用但有些问题,帮忙看看改改!!!
MPU 2003-10-15 04:26:23 ★★用 C 标准库写了个"文件复制"程序,可用但有些问题,帮忙看看改改!!!
/////////////////感觉有写问题大家帮忙看看改改!!!////////////////
/////////////////只在相同目录下复制///////////
/////////////////如下使用/////////////////////
Enter the infile name:
a.rar //源文件
Enter the outfile name:
c.rar //目标文件
/////////////////或者///////////////
mycopy a.rar c.rar
/*
我对小于10 M的文件直接分配内存复制,大于10 M的反复分配10 M内存复制.
*/
// VC++ 6 编译通过 -> cl mycopy.c
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(int argc, char *argv[])
{//////////////////////// 输入控制 //////////////////////
FILE *in,*out;
unsigned long SourceSize = 0,ObjectSize = 0;
unsigned long kilobyte,millionbyte;
unsigned long *buffer;
unsigned long size; // 0 to 4,294,967,295 4G
unsigned long sum,remainder,tempsize = 0,tempnum = 0;
char infile[100],outfile[100];
char *prog = argv[0]; /* program name for errors */
// argv[2] source , argv[3] object
if ( argc == 1 ) //向导输入
{
printf("Enter the infile name:\n");
scanf("%s",infile);
printf("Enter the outfile name:\n");
scanf("%s",outfile);
if ( (in = fopen(infile,"rb")) == NULL )
{
fprintf(stderr, "%s: Can't open source!%s\n",prog, infile);
exit(1);
}
if ( (out = fopen(outfile,"wb")) == NULL )
{
fprintf(stderr, "%s: Can't open source!%s\n",prog, outfile);
exit(1);
}
}
else if ( argc == 3 ) //直接输入 如: mycopy a.rar c.rar
{
if ( (in = fopen(*++argv, "rb")) == NULL )
{
fprintf(stderr, "%s: Can't open source!%s\n",prog, *argv);
exit(1);
}
if ( (out = fopen(*++argv,"wb")) == NULL )
{
fprintf(stderr, "%s: Can't open object!%s\n",prog, *argv);
exit(1);
}
}
else
{
fprintf(stderr, "%s: Error!!!%s\n",prog);
exit(1);
}
if (ferror(stdout))
{
fprintf(stderr, "%s: error writing stdout\n", prog);
exit(1);
}
////////////////// 处理文件复制 /////////////////////
fseek (in, 0, SEEK_END); // 文件指针到文件尾
SourceSize=ftell (in); // 读取该位置,即文件大小
rewind (in); // 让文件指针重新回到文件开始
if ( SourceSize >= 4294967295 ) // >= 4G exit(1)
{
printf("This is file too bigger!");
exit(0);
}
else if ( SourceSize <= 10485760 ) // < 10 M
{
buffer = (int* ) malloc (SourceSize); // 动态分配缓冲区 < 10 M
fread (buffer, 1, SourceSize, in); // 把文件读入缓冲区
fwrite (buffer, 1, SourceSize, out);
}/////////////////以下可能有问题////////////////////
else // > 10 M -> 4294967295 == 4 G
{
sum = SourceSize / 10485760;
remainder = SourceSize % 10485760;
while ( sum-- )
{
buffer = (int* ) malloc (10485760); // 动态分配缓冲区 10 M
fread (buffer, 1, 10485760, in); // 把文件读入缓冲区
fwrite (buffer, 1, 10485760, out);
free(buffer);
}
if ( remainder )
{
buffer = (int* ) malloc (remainder); // 动态分配缓冲区 10 M
fread (buffer, 1, remainder, in); // 把文件读入缓冲区
fwrite (buffer, 1, remainder, out);
free(buffer);
}
}
/////////////// 显示结果 //////////////
fseek (out, 0, SEEK_END); // 文件指针到文件尾
ObjectSize=ftell (out); // 读取该位置,即文件大小
rewind (out); // 让文件指针重新回到文件开始
kilobyte = SourceSize / 1024;
millionbyte = SourceSize / ( 1024 * 1204 );
printf("SourceSize %d byte -> kilobyte %d K -> millionbyte %d M\n",
SourceSize,kilobyte,millionbyte);
kilobyte = SourceSize / 1024;
millionbyte = SourceSize / ( 1024 * 1204 );
printf("ObjectSize %d byte -> kilobyte %d K -> millionbyte %d M\n",
ObjectSize,kilobyte,millionbyte);
//////////////////
free(buffer);
fclose(in);
fclose(out);
}