免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: WHITLACK
打印 上一主题 下一主题

[函数] fread读取文件内容 [复制链接]

论坛徽章:
0
1 [报告]
发表于 2008-12-24 09:59 |显示全部楼层
原帖由 WHITLACK 于 2008-12-23 21:38 发表
将本地的几个文件上传到服务器上,
不知道可以用什么办法?

我想到的是用先将几个文件打包,然后fread

可是现在有个问题是,fread读取文本文件是可以的,

我用tar打包后,使用fread,上传到服务器上的 ...



用fread 函数读取文本文件肯定是没问题的,
但是用你现在的代码读取tar肯定会出问题的,而且你可以试试,读取jpg,等二进制文件都会有问题,不完整的;

fp = fopen(file, "r");//如果此处file为文本文件,读取就没有问题,如果是tar包,就会上传空的文件上去


    if (fp == NULL) {
        printf("file open fail!\n");
        return -1;
    }
    fd = fileno(fp);
    fstat(fd, &theStat);

    if (theStat.st_size > length) {
        printf("file is too big!\n");
        fclose(fp);
        return -1;
    }
    int liSize = 0;
&nbsp;&nbsp;&nbsp;&nbsp;while(liSize < theStat.st_size)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;readCnt = fread(buf + liSize, 1, 1024, fp);
&nbsp;&nbsp;&nbsp;&nbsp;liSize += 1024;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if (readCnt < theStat.st_size ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("lose some.%d %d\n", readCnt,(int)theStat.st_size);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}

论坛徽章:
0
2 [报告]
发表于 2008-12-24 10:00 |显示全部楼层
原帖由 WHITLACK 于 2008-12-23 21:38 发表
将本地的几个文件上传到服务器上,
不知道可以用什么办法?

我想到的是用先将几个文件打包,然后fread

可是现在有个问题是,fread读取文本文件是可以的,

我用tar打包后,使用fread,上传到服务器上的 ...



用fread 函数读取文本文件肯定是没问题的,
但是用你现在的代码读取tar肯定会出问题的,而且你可以试试,读取jpg,等二进制文件都会有问题,不完整的;
LZ用下面我修改的代码就应该没问题的,不信可以试试!

fp = fopen(file, "r");//如果此处file为文本文件,读取就没有问题,如果是tar包,就会上传空的文件上去


&nbsp;&nbsp;&nbsp;&nbsp;if (fp == NULL) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("file open fail!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;fd = fileno(fp);
&nbsp;&nbsp;&nbsp;&nbsp;fstat(fd, &theStat);

&nbsp;&nbsp;&nbsp;&nbsp;if (theStat.st_size > length) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("file is too big!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;int liSize = 0;
&nbsp;&nbsp;&nbsp;&nbsp;while(liSize < theStat.st_size)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;readCnt = fread(buf + liSize, 1, 1024, fp);
&nbsp;&nbsp;&nbsp;&nbsp;liSize += 1024;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;if (readCnt < theStat.st_size ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("lose some.%d %d\n", readCnt,(int)theStat.st_size);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}

论坛徽章:
0
3 [报告]
发表于 2008-12-24 10:04 |显示全部楼层
因为fread 或者read函数读取数据时遇到'\0', 0, 文件结束符都会返回的,所以必须强制它读取到文件的结尾,特别是读取二进制文件

论坛徽章:
0
4 [报告]
发表于 2008-12-24 10:07 |显示全部楼层
fp = fopen(file, "r");//如果此处file为文本文件,读取就没有问题,如果是tar包,就会上传空的文件上去



&nbsp;&nbsp;&nbsp;&nbsp;if (fp == NULL) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("file open fail!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;fd = fileno(fp);
&nbsp;&nbsp;&nbsp;&nbsp;fstat(fd, &theStat);

&nbsp;&nbsp;&nbsp;&nbsp;if (theStat.st_size > length) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("file is too big!\n");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;int liSize = 0;//buf的大小必须大于1024

&nbsp;&nbsp;&nbsp;&nbsp;while(liSize < theStat.st_size)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;readCnt = fread(buf + liSize, 1, 1024, fp);
&nbsp;&nbsp;&nbsp;&nbsp;liSize += 1024;
&nbsp;&nbsp;&nbsp;&nbsp;}//这种是最安全的读取方法

&nbsp;&nbsp;&nbsp;&nbsp;if (readCnt < theStat.st_size ){
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("lose some.%d %d\n", readCnt,(int)theStat.st_size);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;}

论坛徽章:
0
5 [报告]
发表于 2008-12-24 10:35 |显示全部楼层

回复 #17 雨过白鹭洲 的帖子

LS的试试就知道了!

我在gcc VC都是一样的,遇到0就会返回的;
读二进制要强制读取指定大小的

论坛徽章:
0
6 [报告]
发表于 2009-03-05 12:05 |显示全部楼层
我的那种方法肯定可以的,我的程序就是那样处理的,呵呵
LZ不信可以看下能否发送RAR和二进制的文件??!

http://www.google.cn/search?clie ... 1%E4%B8%93%E5%AE%B6
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP