| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2500 人关注过本帖
标题:关于用fread和fwrite复制文件,复制时使用512字节的块
只看楼主 加入收藏
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
关于用fread和fwrite复制文件,复制时使用512字节的块
要求用fread和fwrite复制文件,复制时使用512字节的块。(最后一个块的字节数可能少于512)

我的代码如下,出现越界,求大神指点

程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    FILE *source_fp, *dest_fp;
    int ch;
    char str[512];

    printf("%d,%d\n", sizeof(str), sizeof(str) / sizeof(str[0]));
    if (argc != 3) {
        fprintf(stderr, "usage:fcopy source dest\n");
        exit(EXIT_FAILURE);
    }

    if ((source_fp = fopen(argv[1], "rb")) == NULL) {
        fprintf(stderr, "Can't open %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }

    if ((dest_fp = fopen(argv[2], "wb")) == NULL) {
        fprintf(stderr, "Can't open %s\n", argv[2]);
        fclose(source_fp);
        exit(EXIT_FAILURE);
    }

    while (feof(source_fp) == NULL && ferror(source_fp) == NULL)
    {
        
        fread(str, 512, 1, source_fp);//读取512字节的块,每次读取一个元素
        fwrite(str, 512, 1, dest_fp);//写入1个元素,每个元素占有512字节
    }//由于读取的文件不是512字节的整数倍,因此写入的时候出现越界“烫烫烫”
    fclose(source_fp);
    fclose(dest_fp);
    return 0;
}


图片附件: 游客没有浏览图片的权限,请 登录注册
2017-02-12 17:30
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:15 
fseek(p_file, 0, SEEK_END);
datas = ftell(p_file);

获取文件数据大小。

然后再让文件指针回到文件的开始处:
fseek(p_file,0,SEEK_SET);
fread(str,sizeof(char),datas,p_file);

如果你的编译器支持变长数组的话,就可以根据数据大小来建立一个合适的数组。


[此贴子已经被作者于2017-2-12 18:48编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-02-12 18:46
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
回复 2楼 renkejun1942
非常感谢,我看了这个函数,原则上ftell返回的值不应该进行算术运算,但我还是用了,结果正确,就是不知道还有没有更好的方法

程序代码:
#include <stdio.h>
#include <stdlib.h>

int main(int argc,char *argv[])
{
    FILE *source_fp, *dest_fp;
    long ch;
    int i, j;
    char str[512];

    if (argc != 3) {
        fprintf(stderr, "usage:fcopy source dest\n");
        exit(EXIT_FAILURE);
    }

    if ((source_fp = fopen(argv[1], "rb")) == NULL) {
        fprintf(stderr, "Can't open %s\n", argv[1]);
        exit(EXIT_FAILURE);
    }

    if ((dest_fp = fopen(argv[2], "wb")) == NULL) {
        fprintf(stderr, "Can't open %s\n", argv[2]);
        fclose(source_fp);
        exit(EXIT_FAILURE);
    }

    fseek(source_fp, 0L, SEEK_END);
    ch = ftell(source_fp);
    fseek(source_fp, 0L, SEEK_SET);
    i = ch % 512;
    j = ch / 512;

    if (j > 0)
    {
        fread(str, 512, j, source_fp);
        fwrite(str, 512, j, dest_fp);
    }
    if (i>0)
    {
        fread(str, i, 1, source_fp);
        fwrite(str, i, 1, dest_fp);
    }

    fclose(source_fp);
    fclose(dest_fp);

    return 0;
}
2017-02-12 21:10
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:5 
试试这样可否?每次用1字节块512个记录。
Count = fread(str, 1, 512, source_fp);
if (Count > 512) //读异常
    异常处理;
fwrite(str, 1, Count, dest_fp);
2017-02-12 21:33
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
回复 4楼 吹水佬
1、可行
2、出现错误Count会小于第三个参数
3、不符合题意了,题目要求用512字节的块
2017-02-12 22:59
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
以下是引用yanzy在2017-2-12 22:59:27的发言:

1、可行
2、出现错误Count会小于第三个参数
3、不符合题意了,题目要求用512字节的块

看你上面的也没限制一定都用512字节的块,如:
fwrite(str, i, 1, dest_fp);
对此问题,一定都要用512字节的块fwrite(),除非source_fp的大小是512的倍数,否则用fwrite(str, 512, 1, dest_fp);尾部会有str尾部多余的内容。
2017-02-13 06:22
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:0 
程序代码:
    //while (feof(source_fp) == NULL && ferror(source_fp) == NULL)
    //{
    //    fread(str, 512, 1, source_fp);
    //    fwrite(str, 512, 1, dest_fp);
    //}
    for( size_t n; n=fread(str,1,512,source_fp), n!=0; )
        fwrite(str,1,n,dest_fp);
    if( ferror(source_fp) )
        fprintf(stderr, "bilibala\n");
2017-02-13 08:50
快速回复:关于用fread和fwrite复制文件,复制时使用512字节的块
数据加载中...
 
   



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

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