| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 863 人关注过本帖
标题:fread 函数参数问题
只看楼主 加入收藏
lrcdddd
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2014-7-3
结帖率:11.11%
收藏
已结贴  问题点数:13 回复次数:8 
fread 函数参数问题
fread函数参数COUNT似乎可大可小对结果没多少影响,其实我这种理解可能是错误的,求大神指点迷津!!
比如
#include<stdio.h>
#include<stdlib.h>
void main()
{
    FILE *fps,*fpd;
    char buffer[512],sfilename[30],dfilename[30];
    int readnum;
    printf("Please input source filename:\n");
    scanf("%s",sfilename);
    printf("Please input destine filename:\n");
    scanf("%s",dfilename);
    if((fps=fopen(sfilename,"rb"))==NULL)
    {
        printf("Source File open error!\n");
        exit(1);
    }
    if((fpd=fopen(dfilename,"wb"))==NULL)
    {
        printf("Destine File open error!\n");
        exit(1);
    }
    while((readnum=fread(buffer,1,10,fps))>0) //比如该处‘10’可以用‘20’,‘40’甚至可以用‘1’来代替对文本复制毫无影响,不知是什么原因,事实上源文件数据字节远大于20、40字节
    {
        fwrite(buffer,1,readnum,fpd);
    }
    printf("File copy ok!\n");
    printf("%3d\n",readnum);
    fclose(fps);
    fclose(fpd);
}


[ 本帖最后由 lrcdddd 于 2014-8-9 22:45 编辑 ]
搜索更多相关主题的帖子: 影响 source include 
2014-08-09 22:42
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:5 
“比如该处‘10’可以用‘20’,‘40’甚至可以用‘1’来代替对文本复制毫无影响,不知是什么原因,事实上源文件数据字节远大于20、40字节”

能具体解释一下“对文本复制毫无影响”的意思?

梦想拥有一台龙芯3A-4000
2014-08-09 23:39
apull
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:三体星系
等 级:版主
威 望:216
帖 子:1507
专家分:9241
注 册:2010-3-16
收藏
得分:5 
不用while看看。
2014-08-09 23:58
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
(以下size、count、stream参数见msdn)

fread通过设置一个sc = size * count及stream->_cnt控制复制块大小,返回值为 (size * count - sc) / size。


[ 本帖最后由 ditg 于 2014-8-10 00:21 编辑 ]

梦想拥有一台龙芯3A-4000
2014-08-10 00:06
lrcdddd
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2014-7-3
收藏
得分:0 
这是书上一个例题,我是全文照抄,只是标注处“10”原文是“512”,我就是测试一下用
其他数字代替一下“512”看对程序运行有什么影响,我就找来一篇500字左右的文本文件
作为源文件,在不同count下运行,结果运行结果一致,目标文件都完全复制源文件内容,
楼上的几位讲解还是不懂,特再说明一下
2014-08-10 07:01
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
收藏
得分:0 
我以为你会先做3楼的实验,然后思考的时候可能会用到4楼的内容;另外再注意一下,单独用fread的时候,其实有三个控制参数,不同的组合可能会得到不同的结果,呵呵

[ 本帖最后由 ditg 于 2014-8-10 09:50 编辑 ]

梦想拥有一台龙芯3A-4000
2014-08-10 09:46
lrcdddd
Rank: 1
等 级:新手上路
帖 子:41
专家分:0
注 册:2014-7-3
收藏
得分:0 
可能确实是WHILE的缘故,多谢三楼六楼兄弟!!!
2014-08-10 16:23
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
while((readnum=fread(buffer,1,10,fps))>0) //比如该处‘10’可以用‘20’,‘40’甚至可以用‘1’来代替对文本复制毫无影响,不知是什么原因,事实上源文件数据字节远大于20、40字节


fread()函数内部是一个循环,它的循环计数是count次,每次读size个字节的一块数据。看明白了吗?

如果在最后一次,它读不到size个字节的整块数据,就会结束,并返回成功读取的块数。也就是说,最后读不完整的数据被废弃了,此时函数的返回值小于count,表明读取出了问题,这是检查文件读写有没有错误的方法。你改动没错,只是巧合。

[ 本帖最后由 TonyDeng 于 2014-8-12 13:28 编辑 ]

授人以渔,不授人以鱼。
2014-08-12 13:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
假设文件有100字节,你设size=30,count=1,那么fread()就只都count=1次的size=30字节数据,对循环调用fread()来说,将在第四次时失败,因为它那一次只能读入10个字节,不足size的一块,此时函数返回0(<1),你如果靠这个循环去复制写文件,也就只能写出90字节,所以不可能怎么改都对的。

fread(buufer,1,10,fps),是调用函数一次则内部循环10次每次读1个字节,当文件到最后不足10个字节的时候,函数就返回实际读到多少个1字节,由于是逐个字节读的,所以可以把文件的所有字符都读进来,但写出去却取决于fwrite()的写法,它必须是每次1字节地写出去,才能保证目标文件没有多余的数据被写入。

使用fread()/fwrite()函数对,速度快的诀窍是一次读写一整块数据(通常是1K左右),而不是逐个字符处理,后者的效率是很低的(还原到逐个字符读写的代码是没用的),但也不能把数据块设置得太大,效率与系统和程序使用的缓冲区有关,也与实际硬件的读写速度有关,那是必须用实践来调整最佳参数的。

授人以渔,不授人以鱼。
2014-08-12 13:41
快速回复:fread 函数参数问题
数据加载中...
 
   



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

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