| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2501 人关注过本帖
标题:关于用fread和fwrite复制文件,复制时使用512字节的块
取消只看楼主 加入收藏
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
关于用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
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
yanzy
Rank: 5Rank: 5
等 级:职业侠客
威 望:2
帖 子:104
专家分:372
注 册:2017-2-7
收藏
得分:0 
回复 4楼 吹水佬
1、可行
2、出现错误Count会小于第三个参数
3、不符合题意了,题目要求用512字节的块
2017-02-12 22:59
快速回复:关于用fread和fwrite复制文件,复制时使用512字节的块
数据加载中...
 
   



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

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