| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1163 人关注过本帖
标题:用库函数实现文件的copy,段错误,请教大神啊!
只看楼主 加入收藏
lzm0707
Rank: 2
等 级:论坛游民
帖 子:20
专家分:33
注 册:2012-2-28
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:12 
用库函数实现文件的copy,段错误,请教大神啊!
程序代码:
#include<stdio.h>
#define LENGTH 1024
int main(int argc, char*argv[])
{
    FILE *from_fp,*to_fp;
    char ch,ptr[LENGTH];
    size_t rsize;
    if(argc!=3)
    {
    printf("input error\n");
    exit(1);}
    if((from_fp=fopen(argv[1],"rt"))==NULL)//打开目标文件
        {printf("cannot open file");
        exit(1);}
    if((to_fp=fopen(argv[2],"w+"))==NULL)//打开要写入的文件
        {printf("cannot creat file");
        exit(1);}
    
    while(rsize!=NULL)
    {     
          rsize=fread(ptr,LENGTH,1,argv[1]);//从目标文件中读数据
     fwrite(ptr,LENGTH,1,argv[2]);//写入数据
    }
fclose(from_fp);
fclose(to_fp);
    exit(0);
}


一直提示段错误,在fread那个函数那,在linux下编的,初学者,还不太会用gdb调试,找了半天也找不到问题出在哪,
请教大神们啊。
搜索更多相关主题的帖子: 1024 color 
2012-04-05 14:00
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:5 
请看一下fread的入参说明,还有fwrite

[ 本帖最后由 embed_xuel 于 2012-4-5 14:13 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2012-04-05 14:12
lzm0707
Rank: 2
等 级:论坛游民
帖 子:20
专家分:33
注 册:2012-2-28
收藏
得分:0 
回复 2楼 embed_xuel
多谢指点,是我太大意了。
但改为from_fp和to_fp之后,程序没问题了,但执行时,复制文件的时候会在文件复制完之后多复制了许多乱码过来,这是怎么回事呢?
2012-04-05 14:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:15 
你每次复制1024byte的数据,你知道文件末尾真恰好有这个尺寸的数据让你读?越界了,跟数组越界是同一个道理。

[ 本帖最后由 TonyDeng 于 2012-4-5 14:55 编辑 ]

授人以渔,不授人以鱼。
2012-04-05 14:48
lzm0707
Rank: 2
等 级:论坛游民
帖 子:20
专家分:33
注 册:2012-2-28
收藏
得分:0 
回复 4楼 TonyDeng
不懂,我看资料上说fread函数返回值是实际读到的字节数,我以为执行fread 到时候遇到文件结束符会自己停止。但好像又不是这样,我用gdb调的时候,好像是如果文件没读完放回值是1,读完了返回值是0.
还有,那我怎么实现文件的复制呢,每个文件的字节数都不一样啊
2012-04-05 15:19
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
fread()是返回实际读到的数据量没错,但你没有利用这个返回值来写出。

授人以渔,不授人以鱼。
2012-04-05 15:21
lzm0707
Rank: 2
等 级:论坛游民
帖 子:20
专家分:33
注 册:2012-2-28
收藏
得分:0 
回复 6楼 TonyDeng
我试过,把fwrite里的LENGTH换成rsize,这样跟本实现不了复制了,好像是执行fread的时候读没读完文件,返回值是1,读完了文件返回值是0.
2012-04-05 15:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
fwrite(ptr, sizeof(char), rsize, file)

授人以渔,不授人以鱼。
2012-04-05 15:40
lzm0707
Rank: 2
等 级:论坛游民
帖 子:20
专家分:33
注 册:2012-2-28
收藏
得分:0 
回复 8楼 TonyDeng
程序代码:
#include<stdio.h>
#define LENGTH 10
int main(int argc, char*argv[])
{
    FILE *from_fp,*to_fp;
    char ch,*ptr;
    size_t wsize,rsize;
    if(argc!=3)
    {
    printf("input error\n");
    exit(1);}
    if((from_fp=fopen(argv[1],"rt"))==NULL)
        {printf("cannot open file");
        exit(1);}
    if((to_fp=fopen(argv[2],"w+"))==NULL)
        {printf("cannot creat file");
        exit(1);}
    
    while(rsize!=NULL)
    {     
          rsize=fread(ptr,LENGTH,1,from_fp);
     printf("%d",rsize); 
    fwrite(ptr,sizeof(char),rsize,to_fp);
    }
fclose(from_fp);fclose(to_fp);
    exit(0);
}


按你说的改了也不行,我把LENGTH改为10,加了个printf,输出的全是1,最后一个是0.
是不是fread 的返回值有啥不对啊
2012-04-05 15:49
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
收藏
得分:0 
还可以用fgetc实现。
fread返回的是实际读取字节数。也就是说读到文件最后不足缓冲区1024字节的时候,返回的是实际读入的数。
你可以尝试用feof()函数来判断文件是否读到尾部了。

我们都在路上。。。。。
2012-04-05 15:57
快速回复:用库函数实现文件的copy,段错误,请教大神啊!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.041229 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved