免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 19185 | 回复: 27
打印 上一主题 下一主题

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-23 21:38 |只看该作者 |倒序浏览
20可用积分
将本地的几个文件上传到服务器上,
不知道可以用什么办法?

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

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

我用tar打包后,使用fread,上传到服务器上的文件都是0字节的空文件

不知fread函数对读取文件的格式有什么要求?
有什么方法可以解决吗?

谢谢?



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

 73     if (fp == NULL) {
 74         printf("file open fail!\n");
 75         return -1;
 76     }
 77     fd = fileno(fp);
 78     fstat(fd, &theStat);
 79
 80     if (theStat.st_size > length) {
 81         printf("file is too big!\n");
 82         fclose(fp);
 83         return -1;
 84     }
 85     readCnt = fread(buf, 1, theStat.st_size, fp);
&nbsp;86     if (readCnt < theStat.st_size ){
&nbsp;87         printf("lose some.%d %d\n", readCnt,(int)theStat.st_size);
&nbsp;88         fclose(fp);
&nbsp;89         return -1;
&nbsp;90     }


[ 本帖最后由 WHITLACK 于 2008-12-24 04:35 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-12-23 22:07 |只看该作者
最好用二进制文件"rb"方式
没看到写数据?
另外,为什么不用脚本什么的来做,方便些

[ 本帖最后由 tyc611 于 2008-12-23 22:10 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-12-23 22:15 |只看该作者
原帖由 tyc611 于 2008-12-23 22:07 发表
读二进制文件"rb"试试
另外,为什么不用脚本什么的来做,方便些



谢谢回复,用脚本是方便些,但是因为这个东西的基本框架已经做好了,接口已经有了,就差往里面填内容了,所以就这样做了


我在fopen里用了rb,但是服务器那端报错,是不是因为我上面是这样定义的?

char *buf

程序运行不报错,但是服务器端提示失败

论坛徽章:
0
4 [报告]
发表于 2008-12-23 23:06 |只看该作者

回复 #3 WHITLACK 的帖子

你buf分配内存了吧?
你的代码不全,我也无法判断问题在哪

论坛徽章:
0
5 [报告]
发表于 2008-12-23 23:40 |只看该作者

回复 #4 tyc611 的帖子

在这里还要特意为buf分配内存吗?

我如果读取一个文本文件是正常的啊

一读tar包就会出错

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
6 [报告]
发表于 2008-12-23 23:42 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2008-12-23 23:56 |只看该作者
代码大致是这样的,接口已经做好了,现在只需要把CONFFILES_NAME的内容交给*buf就可以了

但是由于是多个文件,所以采用了tar打包的方法(tar打包调用脚本已经省略),但是这样就会出错,

如果CONFFILES_NAME是一个文本文件,就没有问题

在此再次谢过各位!


49 int dev_getconfigfile(char *buf, int length, int *pflen)
&nbsp;50 {
&nbsp;51     int readCnt = 0;
&nbsp;52     FILE *fp;
&nbsp;53     int fd;
&nbsp;54     struct stat theStat;
&nbsp;55     char filename[128];
&nbsp;56     strcpy(filename, CONFFILES_NAME);
&nbsp;57     fp = fopen(filename, "r");
&nbsp;58     if (fp == NULL) {
&nbsp;59         printf("file open fail!\n");
&nbsp;60         return -1;
&nbsp;61     }
&nbsp;62     fd = fileno(fp);
&nbsp;63     fstat(fd, &theStat);
&nbsp;64     
&nbsp;65     if (theStat.st_size > length) {
&nbsp;66         printf("file is too big!\n");
&nbsp;67         fclose(fp);
&nbsp;68         return -1;
&nbsp;69     }   
&nbsp;70     
&nbsp;71     readCnt = fread(buf, 1, theStat.st_size, fp);
&nbsp;72     if (readCnt < theStat.st_size ){
&nbsp;73         printf("lose some.%d %d\n", readCnt,(int)theStat.st_size);
&nbsp;74         fclose(fp);
&nbsp;75         return -1;
&nbsp;76     }
&nbsp;77     fclose(fp);
&nbsp;78     *pflen = theStat.st_size;
&nbsp;79     return 0;
&nbsp;80 }


[ 本帖最后由 WHITLACK 于 2008-12-24 04:36 编辑 ]

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
8 [报告]
发表于 2008-12-24 00:06 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
9 [报告]
发表于 2008-12-24 05:23 |只看该作者

  1. 65     if (theStat.st_size > length) {
  2. 66         printf("file is too big!\n");
  3. 67         fclose(fp);
  4. 68         return -1;
  5. 69     }
复制代码

如果tar件大于length就退出了。所以要tar文件比较小或者length比较大,才能保证tar文件的内容一次赋值给buf,不然不会给buf赋值。

不知道buf赋值后怎么用的。如果当成字符串用的肯定不行。
Tar文件格式

  1.   struct tar_header
  2.   {
  3.    char name[100];
  4.    char mode[8];
  5.    char uid[8];
  6.    char gid[8];
  7.    char size[12];
  8.    char mtime[12];
  9.    char chksum[8];
  10.    char typeflag;
  11.    char linkname[100];
  12.    char magic[6];
  13.    char version[2];
  14.    char uname[32];
  15.    char gname[32];
  16.    char devmajor[8];
  17.    char devminor[8];
  18.    char prefix[155];
  19.    char padding[12];
  20.   };
复制代码


http://www.cublog.cn/u/12592/showart_457496.html
http://www.moon-soft.com/program/FORMAT/comm/tar.htm

论坛徽章:
0
10 [报告]
发表于 2008-12-24 07:11 |只看该作者
fread  语法:
  #include <stdio.h>
  int fread( void *buffer, size_t size, size_t num, FILE *stream );

函数fread()读取[num]个对象(每个对象大小为size(大小)指定的字节数),并把它们替换到由buffer(缓冲区)指定的数组. 数据来自给出的输入流. 函数的返回值是读取的内容数量...

使用feof()或ferror()判断到底发生哪个错误.


fopen  语法:
  #include <stdio.h>
  FILE *fopen( const char *fname, const char *mode );
fopen()函数打开由fname(文件名)指定的文件, 并返回一个关联该文件的流.如果发生错误, fopen()返回NULL. mode(方式)是用于决定文件的用途(例如 用于输入,输出,等等)
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP