免费注册 查看新帖 |

Chinaunix

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

[函数] 请教一下fread函数的小问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-04 16:48 |只看该作者 |倒序浏览
正在看《UNIX环境高级编程》这本书,写了一个小程序联系联系。
不过出现了一个让我摸不着头脑的小问题:

  1. #include <stdio.h>
  2. #include <errno.h>

  3. #define MAXLINE 32

  4. int main(int argc,char **argv)
  5. {
  6.         FILE *fp;
  7.         char buf[MAXLINE],tmpbuf[MAXLINE];
  8.         char *Path;
  9.        
  10.         if(argc != 2){
  11.                 printf("usage: ./test pathname\n");
  12.                 return -1;
  13.         }
  14.        
  15.         sprintf(tmpbuf,"%s/shiner/%s",getenv("HOME"),argv[1]);
  16.         Path = tmpbuf;
  17.        
  18.         if((fp = fopen(Path,"r+")) == NULL){
  19.                 printf("fopen error: %s\n",strerror(errno));
  20.                 return -1;
  21.         }
  22.        
  23.         if(fread(buf,sizeof(char),MAXLINE,fp) != MAXLINE){
  24.                 printf("fread error: %s\n",strerror(errno));
  25.                 return -1;
  26.         }
  27.        
  28.         printf("read buf from %s is: %s\n",argv[1],buf);
  29.         return 0;
  30. }

复制代码


用fread 从指定文件里读出长度32位的字符放到buf里,用printf 打印出来后除了正常所需要的32位字符外后面竟然有一些乱码一样的东西也打印在屏幕上。如:
read buf from myfile is: ASDFGHJKLQWERTYUIOZXCVBNMSDFGHJKh?縺??
B樻

论坛徽章:
0
2 [报告]
发表于 2007-09-04 16:54 |只看该作者
原帖由 shiner 于 2007-9-4 16:48 发表
正在看《UNIX环境高级编程》这本书,写了一个小程序联系联系。
不过出现了一个让我摸不着头脑的小问题:

#include
#include

#define MAXLINE 32

int main(int argc,char **argv)
{
        FILE *fp;
...



数据没以 \0 结束

论坛徽章:
0
3 [报告]
发表于 2007-09-04 16:59 |只看该作者

回复 #2 web_surf 的帖子

嗯,按理说我的buf 里32 位已被读出的字符全部占满的,应输出buf的所有字符,请问一下那个乱码一样的东西是从哪读出来的?

论坛徽章:
0
4 [报告]
发表于 2007-09-04 17:03 |只看该作者
原帖由 shiner 于 2007-9-4 16:59 发表
嗯,按理说我的buf 里32 位已被读出的字符全部占满的,应输出buf的所有字符,请问一下那个乱码一样的东西是从哪读出来的?

内存&buf[31]以后的内容。

论坛徽章:
0
5 [报告]
发表于 2007-09-04 17:08 |只看该作者

回复 #4 web_surf 的帖子

哦! 谢谢哈
那有什么好点的办法我只打印我需要buf里的数据,而不输出后面一些没用的东西呢?

论坛徽章:
0
6 [报告]
发表于 2007-09-04 17:14 |只看该作者
原帖由 shiner 于 2007-9-4 17:08 发表
哦! 谢谢哈
那有什么好点的办法我只打印我需要buf里的数据,而不输出后面一些没用的东西呢?


const int buf_max = 31;
char buf[buf_max + 1];

int len = fread(buf,1, buf_max, ...);
buf[len] = '\0';

论坛徽章:
0
7 [报告]
发表于 2007-09-04 17:16 |只看该作者

回复 #6 web_surf 的帖子

谢谢了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP