📄 subject_56141.htm
字号:
<p>
序号:56141 发表者:Zerg 发表日期:2003-10-15 16:29:54
<br>主题:★★用 C 标准库写了个"文件复制"程序,可用但有些问题,帮忙看看改改!!!
<br>内容:★★用 C 标准库写了个"文件复制"程序,可用但有些问题,帮忙看看改改!!!<BR><BR>/////////////////感觉有写问题大家帮忙看看改改!!!////////////////<BR><BR>/////////////////只在相同目录下复制///////////<BR>/////////////////如下使用/////////////////////<BR>Enter the infile name:<BR>a.rar //源文件<BR>Enter the outfile name:<BR>c.rar //目标文件<BR><BR>/////////////////或者///////////////<BR>mycopy a.rar c.rar<BR><BR>/*<BR>我对小于10 M的文件直接分配内存复制,大于10 M的反复分配10 M内存复制.<BR>*/<BR><BR>// VC++ 6 编译通过 -> cl mycopy.c<BR>#include <stdio.h><BR>#include <conio.h><BR>#include <stdlib.h><BR><BR>void main(int argc, char *argv[])<BR>{//////////////////////// 输入控制 //////////////////////<BR> FILE *in,*out;<BR> unsigned long SourceSize = 0,ObjectSize = 0;<BR> unsigned long kilobyte,millionbyte;<BR> unsigned long *buffer;<BR> unsigned long size; // 0 to 4,294,967,295 4G<BR> unsigned long sum,remainder,tempsize = 0,tempnum = 0;<BR> char infile[100],outfile[100];<BR> <BR> char *prog = argv[0]; /* program name for errors */<BR><BR> // argv[2] source , argv[3] object<BR> if ( argc == 1 ) //向导输入<BR> {<BR> printf("Enter the infile name:\n");<BR> scanf("%s",infile);<BR> printf("Enter the outfile name:\n");<BR> scanf("%s",outfile);<BR> if ( (in = fopen(infile,"rb")) == NULL )<BR> {<BR> fprintf(stderr, "%s: Can't open source!%s\n",prog, infile);<BR> exit(1);<BR> }<BR> if ( (out = fopen(outfile,"wb")) == NULL )<BR> {<BR> fprintf(stderr, "%s: Can't open source!%s\n",prog, outfile);<BR> exit(1);<BR> }<BR> }<BR> else if ( argc == 3 ) //直接输入 如: mycopy a.rar c.rar<BR> {<BR> if ( (in = fopen(*++argv, "rb")) == NULL ) <BR> { <BR> fprintf(stderr, "%s: Can't open source!%s\n",prog, *argv);<BR> exit(1);<BR> } <BR> if ( (out = fopen(*++argv,"wb")) == NULL )<BR> {<BR> fprintf(stderr, "%s: Can't open object!%s\n",prog, *argv);<BR> exit(1);<BR> } <BR> }<BR> else<BR> {<BR> fprintf(stderr, "%s: Error!!!%s\n",prog);<BR> exit(1);<BR> }<BR><BR> if (ferror(stdout)) <BR> {<BR> fprintf(stderr, "%s: error writing stdout\n", prog);<BR> exit(1);<BR> }<BR>////////////////// 处理文件复制 /////////////////////<BR> fseek (in, 0, SEEK_END); // 文件指针到文件尾<BR> SourceSize=ftell (in); // 读取该位置,即文件大小<BR> rewind (in); // 让文件指针重新回到文件开始<BR> <BR> if ( SourceSize >= 4294967295 ) // >= 4G exit(1)<BR> {<BR> printf("This is file too bigger!");<BR> exit(0);<BR> }<BR> else if ( SourceSize <= 10485760 ) // < 10 M<BR> {<BR> buffer = (int* ) malloc (SourceSize); // 动态分配缓冲区 < 10 M<BR> fread (buffer, 1, SourceSize, in); // 把文件读入缓冲区<BR> fwrite (buffer, 1, SourceSize, out);<BR> }/////////////////以下可能有问题////////////////////<BR> else // > 10 M -> 4294967295 == 4 G<BR> {<BR> sum = SourceSize / 10485760;<BR> remainder = SourceSize % 10485760;<BR> while ( sum-- )<BR> {<BR><BR> buffer = (int* ) malloc (10485760); // 动态分配缓冲区 10 M<BR> fread (buffer, 1, 10485760, in); // 把文件读入缓冲区<BR> fwrite (buffer, 1, 10485760, out);<BR> free(buffer);<BR> }<BR> if ( remainder )<BR> {<BR> buffer = (int* ) malloc (remainder); // 动态分配缓冲区 10 M<BR> fread (buffer, 1, remainder, in); // 把文件读入缓冲区<BR> fwrite (buffer, 1, remainder, out);<BR> free(buffer);<BR> }<BR> }<BR>/////////////// 显示结果 ////////////// <BR> fseek (out, 0, SEEK_END); // 文件指针到文件尾<BR> ObjectSize=ftell (out); // 读取该位置,即文件大小<BR> rewind (out); // 让文件指针重新回到文件开始<BR><BR> kilobyte = SourceSize / 1024;<BR> millionbyte = SourceSize / ( 1024 * 1204 );<BR>printf("SourceSize %d byte -> kilobyte %d K -> millionbyte %d M\n",<BR> SourceSize,kilobyte,millionbyte);<BR><BR> kilobyte = SourceSize / 1024;<BR> millionbyte = SourceSize / ( 1024 * 1204 );<BR>printf("ObjectSize %d byte -> kilobyte %d K -> millionbyte %d M\n",<BR> ObjectSize,kilobyte,millionbyte);<BR>//////////////////<BR> free(buffer);<BR> fclose(in);<BR> fclose(out);<BR>}<BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:jackyxio 回复日期:2003-10-15 17:41:37
<br>内容:有什么问题说清楚。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:jackyxio 回复日期:2003-10-15 17:46:59
<br>内容:为什么要取10M那么大的BUFF呢???1K够了!循环退出条件改为源文件eof。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -