免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2008-12-24 09:06 |只看该作者
应该没什么问题啊.

直接用read吧.

论坛徽章:
0
12 [报告]
发表于 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
13 [报告]
发表于 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
14 [报告]
发表于 2008-12-24 10:03 |只看该作者
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#define CONFFILES_NAME "test.tar"

int dev_getconfigfile(char *buf, int length, int *pflen)
{
&nbsp;&nbsp;&nbsp;&nbsp;int readCnt = 0;
&nbsp;&nbsp;&nbsp;&nbsp;FILE *fp;
&nbsp;&nbsp;&nbsp;&nbsp;int fd;
&nbsp;&nbsp;&nbsp;&nbsp;struct stat theStat;
&nbsp;&nbsp;&nbsp;&nbsp;char filename[128];
&nbsp;&nbsp;&nbsp;&nbsp;strcpy(filename, CONFFILES_NAME);
&nbsp;&nbsp;&nbsp;&nbsp;fp = fopen(filename, "r");
&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;readCnt = fread(buf, 1, theStat.st_size, fp);
&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;}
&nbsp;&nbsp;&nbsp;&nbsp;fclose(fp);
&nbsp;&nbsp;&nbsp;&nbsp;*pflen = theStat.st_size;
&nbsp;&nbsp;&nbsp;&nbsp;return 0;
}

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;char buf[102400];
&nbsp;&nbsp;&nbsp;&nbsp;int pflen;
&nbsp;&nbsp;&nbsp;&nbsp;int rs = dev_getconfigfile(buf, 102400, &pflen);
&nbsp;&nbsp;&nbsp;&nbsp;printf("rs = %d\n", rs);
&nbsp;&nbsp;&nbsp;&nbsp;printf("pflen = %d\n", pflen);
&nbsp;&nbsp;&nbsp;&nbsp;int i;
&nbsp;&nbsp;&nbsp;&nbsp;for (i = 0; i < pflen; i++) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%c", buf[i]);
&nbsp;&nbsp;&nbsp;&nbsp;}
}


我用你的函数,测试了下,在我的机器上是可以正常读取出来的

不过不推荐这样使用,你直接读取文件,判断是否到文件尾不是很好吗

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

论坛徽章:
0
16 [报告]
发表于 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
17 [报告]
发表于 2008-12-24 10:16 |只看该作者
原帖由 chary8088 于 2008-12-24 10:04 发表
因为fread 或者read函数读取数据时遇到'\0', 0, 文件结束符都会返回的,所以必须强制它读取到文件的结尾,特别是读取二进制文件


遇到'\0'和0不会结束的

论坛徽章:
0
18 [报告]
发表于 2008-12-24 10:35 |只看该作者

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

LS的试试就知道了!

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

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
19 [报告]
发表于 2008-12-24 16:45 |只看该作者
原帖由 chary8088 于 2008-12-24 10:35 发表
LS的试试就知道了!

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

你是根据打印的结果判断,还是根据fread的返回值判断的。

论坛徽章:
0
20 [报告]
发表于 2008-12-24 17:07 |只看该作者

回复 #16 chary8088 的帖子

chary8088 兄,按照您的方法,服务器端仍然会提示上传失败

to LS各位兄弟:
      
      会不会是因为服务器端是将buf当做字符串进行处理的,因此上传失败?

      需要将buf转换为字符型吗?如果需要,应该怎么做啊?谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP