鱼C论坛

 找回密码
 立即注册
查看: 5641|回复: 27

本人菜鸟想用C语言写个文件复制程序,可是提示有错误

[复制链接]
发表于 2011-9-26 20:54:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 沧海小虾 于 2011-9-26 20:54 编辑

            本人菜鸟想用C语言写个文件复制程序,可是提示有错误,错误信息如图:

                               
登录/注册后可看大图
源代码如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void CopyFile(FILE *lpSrc,FILE *lpDes,long _Size)
{
      long *Buffer;

      Buffer = malloc(_Size);

      fread(Buffer,_Size,1,lpSrc);                       //将源文件数据读到缓冲区
      fwrite(Buffer,_Size,1,lpDes);                      //将缓冲区的数据写入到目的文件中
   
      free(Buffer);
}
main()
{
     long Size;
     FILE *LpSrcFile, *LpDesFile;
     char *szSrcFilename, *szDesFilename;
     printf("请输入要复制的文件名:");
     gets(szSrcFilename);
     printf("请输入复制到的文件的名称:");
     gets(szDesFilename);

     LpSrcFile = open(szSrcFilename,"rb");
     LpDesFile = open(szDesFilename,"wb");

     fseek(LpSrcFile,0L,SEEK_END);
     Size = ftell(LpSrcFile);                               //求要复制的数据块的长度
   
    CopyFile( LpSrcFile, LpDesFile, Size);
   
    fclose(LpSrcFile);
    fclose(LpDesFile);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-26 20:55:00 | 显示全部楼层
希望高手指点下,小弟不胜感激
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-26 21:21:22 | 显示全部楼层
调试下就可以了撒?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-26 22:06:00 | 显示全部楼层
嗯?求详解,不懂。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-26 22:08:28 | 显示全部楼层
在主要功能上下断啊。。挺简单的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-26 22:09:28 | 显示全部楼层
本帖最后由 yipwing 于 2011-9-26 22:09 编辑

你这个貌似是内存方面的问题吧。。
你看看分配内存方面哪个地方出错了。。一步一步的执行就明白哪一步出了问题。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-26 22:13:33 | 显示全部楼层
文件名数组要先给分配空间吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-26 22:17:04 | 显示全部楼层
wangyexin 发表于 2011-9-26 22:13
文件名数组要先给分配空间吧

别那么直接嘛。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-26 22:40:03 | 显示全部楼层
谢谢了你们,我先试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-27 10:59:55 | 显示全部楼层
本帖最后由 沧海小虾 于 2011-9-27 11:01 编辑

      改了一下还是没有解决,新的问题是指向打开的源文件的指针不能赋值。这是为什么呢?小弟没有调试出来,请高手再指点一下。
    改后的代码:
#include <stdio.h>
#include <stdlib.h>

void CopyFile(FILE *lpSrc,FILE *lpDes,long _Size)
{
        long *Buffer;
        
        Buffer = malloc( _Size );
        
        fread( Buffer,_Size,1,lpSrc );                       //将源文件数据读到缓冲区
        fwrite( Buffer,_Size,1,lpDes );                      //将缓冲区的数据写入到目的文件中
   
        free( Buffer );

}
main()
{
        long Size;
        FILE *LpSrcFile, *LpDesFile;
        char szSrcFilename[20], szDesFilename[20];
        char *lpszSF, *lpszDF;

        printf( "请输入要复制的文件名:" );
        gets( szSrcFilename );                                    //获取源文件名称
        printf( "请输入复制到的文件的名称:" );
        gets( szDesFilename );                                    //获取目的文件名称
        
        lpszSF = szSrcFilename;
        lpszDF = szDesFilename;

    if( ( LpSrcFile = fopen( lpszSF,"rb"  ))  == NULL )         //打开源文件
                printf( "The file %s was not opened",*szSrcFilename );
        else
            printf( "The file %S was opened successfully!",*szSrcFilename );
   
        if( ( LpDesFile = fopen( lpszDF,"wb"  ) ) == NULL )
                printf( "The file %s was not opened",szDesFilename );
        else
            printf( "The file %S was opened successfully!",*szDesFilename );
        
        
        fseek( LpSrcFile,0L,SEEK_END );
        Size = ftell( LpSrcFile );                                                  //求要复制的数据块的长度
        rewind( LpSrcFile );

       CopyFile( LpSrcFile, LpDesFile, Size );                                     //文件的复制
   
       if( fclose( LpSrcFile ) )
                printf( "The file %s was not closed",szSrcFilename );
       if( fclose( LpDesFile ) )
                printf( "The file %s was not closed",szDesFilename );
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
头像被屏蔽
发表于 2011-9-27 15:19:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-27 19:49:00 | 显示全部楼层
是的,关键是open源文件时的指针没有被赋值,这点我不知道怎么回事。:'(
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-27 22:21:41 | 显示全部楼层
本帖最后由 yipwing 于 2011-9-27 22:23 编辑

改了下,给你看看。。我写得也不好。。请多指教。。。 下面代码用GCC编译器测试通过。。
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. FILE* dstFile;FILE* srcFile;

  5. void CopyFile(long _Size)
  6. {
  7.         long *Buffer;

  8.         Buffer = (long*)malloc( _Size+1 );

  9.         fread( Buffer,_Size,1,srcFile );                       //将源文件数据读到缓冲区

  10.         fwrite( Buffer,_Size,1,dstFile );                      //将缓冲区的数据写入到目的文件中

  11.         free( Buffer );

  12. }

  13. int main()
  14. {
  15.     char* szCopy = (char*)malloc(20);
  16.     char* szNewCopy = (char*)malloc(20);

  17.     long fsize;
  18.     if((szCopy==NULL) && (szNewCopy==NULL))
  19.     {
  20.         printf("分配内存出错");
  21.     }
  22.     printf("请输入要复制的文件:");
  23.     gets(szCopy);
  24.     printf("请输入复制到的文件的名称:");
  25.     gets(szNewCopy);

  26.     srcFile = fopen(szCopy,"rb");
  27.     if(srcFile!=NULL)
  28.         printf("成功打开文件");
  29.     else{
  30.         printf("打开文件失败");
  31.         return 1;
  32.     }
  33.     dstFile = fopen(szNewCopy,"wb");
  34.     if(srcFile!=NULL)
  35.         printf("成功打开文件");
  36.     else{
  37.         printf("打开文件失败");
  38.         return 1;
  39.     }

  40.     fseek(srcFile,0L,SEEK_END);

  41.     fsize = ftell(srcFile);

  42.     rewind(srcFile);

  43.     CopyFile(fsize);

  44.     fclose(srcFile);
  45.     fclose(dstFile);
  46.     return 1;
  47. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-27 22:44:16 | 显示全部楼层
谢谢,这个效果就是我要达到的目的,嗯,不过还不明白其中的道理。太感谢你了!:loveliness:我先研究一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-28 00:14:02 | 显示全部楼层
你那个程序是用错了指针。。导致的问题。。
lpszSF = szSrcFilename;
lpszDF = szDesFilename;
你自己调试看看,这里是否接收到了文件名。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 09:29:59 | 显示全部楼层
嗯,是收不到地址。这是怎么形成的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-9-28 09:35:29 | 显示全部楼层
我发现是这一步能收到地址 szSrcFilename有值的,但到了 LpSrcFile = fopen( szSrcFilename,"rb"  );fopen的返回值为零。而下一个目的文件由于是新创建的可以打开。那么也就是说源文件打不开。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-29 01:44:29 | 显示全部楼层
沧海小虾 发表于 2011-9-28 09:35
我发现是这一步能收到地址 szSrcFilename有值的,但到了 LpSrcFile = fopen( szSrcFilename,"rb"  );fopen的 ...

lpszSF = szSrcFilename; 你接收值是szsrcfilename,你又赋值给lpszsf 看下lpszsf有没值。。。
lpszDF = szDesFilename;
你源文件  LpSrcFile = fopen( lpszSF,"rb"  ))  这里看下lpszSF这个指针,有没有值,或看下是否有错误。。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-9-29 11:40:02 | 显示全部楼层
你可能没关闭工作区
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
头像被屏蔽
发表于 2011-9-29 14:39:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 08:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表