⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_56141.htm

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