免费注册 查看新帖 |

Chinaunix

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

请求fwrite帮助 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-09-11 11:13 |只看该作者 |倒序浏览
用fwrite函数向一个文件中写数据时,为什么最后总是会多写几行?



  1.   fp = fopen(local_file, "a");
  2.   if(!fp)  
  3.   {
  4.     printf("create file error! %s\n", strerror(errno));
  5.     return 0;
  6.   }
  7.   printf("\nThe following is the response header:\n");
  8.   i=0;


  9. /* ........http...response */
  10.   /*-----------reading header info--------------*/

  11.   int status = 0;
  12.   char size[1024]={0};
  13.   char *len=0;
  14.   long data_size=0;
  15.   while((nbytes=read(sockfd,buffer,sizeof(buffer)))!=0)
  16.   {
  17.      if(status == 0)
  18.      {
  19.         printf("-----------------exec ---------\n");
  20.         char *hp = buffer;  // Start of header
  21.         char *cp = 0;
  22.         char *ep = hp + 1024;   // End of string
  23.         char *bp = 0;                       // Start of body
  24.         char *lp = 0;                       // Start of content-length value
  25.         char *kp = 0;                       // Start of connection value

  26.         for (cp = hp; (bp == 0) && (cp < ep); ++cp)
  27.         {
  28.                 if ((ep - cp > 16) && (strncasecmp(cp, "Content-Length: ", 16) == 0))
  29.                 {
  30.                         lp = cp + 16;
  31.                         while(*lp!='\r'&&i<sizeof(size))
  32.                         {
  33.                                 size[i]=*lp;
  34.                                 lp++;
  35.                                 i++;
  36.                         }
  37.                         if(*lp=='\r')
  38.                         {
  39.                                 size[i]='\0';
  40.                         }
  41.                         len=(char *)malloc(strlen(size));
  42.                         strncpy(len,size,strlen(size));
  43.                         data_size=(long)atoi(len);//get the file size
  44.                 }
  45.                 else if ((ep - cp > 12) && (strncasecmp(cp, "Connection: ", 12) == 0))
  46.                 {
  47.                         kp = cp + 12;

  48.                 }
  49.                 else if ((ep - cp > 4) && (strncmp(cp, "\r\n\r\n", 4) == 0))
  50.                 {
  51.                         bp = cp + 4;
  52.                         status =1;
  53.                 }
  54.                 else if ((ep - cp > 2) && (strncmp(cp, "\n\n", 2) == 0))
  55.                 {
  56.                         bp = cp + 2;
  57.                         status = 1;
  58.                 }
  59.         }

  60.         if(bp == 0&& status == 0)
  61.          {
  62.                         continue;
  63.           }
  64.         /*----------read header info-------------*/

  65.         char tmp[10240]={0};
  66.         cp=bp;
  67.         for(i=0;i<ep-cp&&bp<ep;i++,bp++)
  68.         {
  69.                 tmp[i]=*bp;
  70.         }

  71.         if(fwrite(tmp,ep-cp,1,fp)) fflush(fp);

  72.         continue;
  73.     }
  74.     else
  75.     {
  76.         /*-----------read body info--------------*/

  77.         long file_size=0;
  78.         struct stat f_stat;

  79.         if( stat( local_file, &f_stat ) == -1 )
  80.         {
  81.             return -1;
  82.         }

  83.         file_size=(long)f_stat.st_size;

  84.         if(file_size<=data_size)
  85.         {
  86.                 if(fwrite(buffer,sizeof(buffer),1,fp))
  87.                         {
  88.                         fflush(fp);
  89.                         }
  90.                 else printf("failure........\n");
  91.         }
  92.         else
  93.         {
  94.                 fclose(fp);
  95.                 break;
  96.         }
  97.     }

  98. }

复制代码

[ 本帖最后由 seawand_zhu 于 2007-9-11 12:49 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2007-09-11 11:16 |只看该作者
原帖由 seawand_zhu 于 2007-9-11 11:13 发表
用fwrite函数向一个文件中写数据时,为什么最后总是会多写几行?


GDB, 或者贴代码吧, 不然没人知道哪里出了问题.

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

代码如下



  1.   fp = fopen(local_file, "a");
  2.   if(!fp)  
  3.   {
  4.     printf("create file error! %s\n", strerror(errno));
  5.     return 0;
  6.   }
  7.   printf("\nThe following is the response header:\n");
  8.   i=0;


  9. /* ........http...response */
  10.   /*-----------reading header info--------------*/

  11.   int status = 0;
  12.   char size[1024]={0};
  13.   char *len=0;
  14.   long data_size=0;
  15.   while((nbytes=read(sockfd,buffer,sizeof(buffer)))!=0)
  16.   {
  17.      if(status == 0)
  18.      {
  19.         printf("-----------------exec ---------\n");
  20.         char *hp = buffer;  // Start of header
  21.         char *cp = 0;
  22.         char *ep = hp + 1024;   // End of string
  23.         char *bp = 0;                       // Start of body
  24.         char *lp = 0;                       // Start of content-length value
  25.         char *kp = 0;                       // Start of connection value

  26.         for (cp = hp; (bp == 0) && (cp < ep); ++cp)
  27.         {
  28.                 if ((ep - cp > 16) && (strncasecmp(cp, "Content-Length: ", 16) == 0))
  29.                 {
  30.                         lp = cp + 16;
  31.                         while(*lp!='\r'&&i<sizeof(size))
  32.                         {
  33.                                 size[i]=*lp;
  34.                                 lp++;
  35.                                 i++;
  36.                         }
  37.                         if(*lp=='\r')
  38.                         {
  39.                                 size[i]='\0';
  40.                         }
  41.                         len=(char *)malloc(strlen(size));
  42.                         strncpy(len,size,strlen(size));
  43.                         data_size=(long)atoi(len);//get the file size
  44.                 }
  45.                 else if ((ep - cp > 12) && (strncasecmp(cp, "Connection: ", 12) == 0))
  46.                 {
  47.                         kp = cp + 12;

  48.                 }
  49.                 else if ((ep - cp > 4) && (strncmp(cp, "\r\n\r\n", 4) == 0))
  50.                 {
  51.                         bp = cp + 4;
  52.                         status =1;
  53.                 }
  54.                 else if ((ep - cp > 2) && (strncmp(cp, "\n\n", 2) == 0))
  55.                 {
  56.                         bp = cp + 2;
  57.                         status = 1;
  58.                 }
  59.         }

  60.         if(bp == 0&& status == 0)
  61.          {
  62.                         continue;
  63.           }
  64.         /*----------read header info-------------*/

  65.         char tmp[10240]={0};
  66.         cp=bp;
  67.         for(i=0;i<ep-cp&&bp<ep;i++,bp++)
  68.         {
  69.                 tmp[i]=*bp;
  70.         }

  71.         if(fwrite(tmp,ep-cp,1,fp)) fflush(fp);

  72.         continue;
  73.     }
  74.     else
  75.     {
  76.         /*-----------read body info--------------*/

  77.         long file_size=0;
  78.         struct stat f_stat;

  79.         if( stat( local_file, &f_stat ) == -1 )
  80.         {
  81.             return -1;
  82.         }

  83.         file_size=(long)f_stat.st_size;

  84.         if(file_size<=data_size)
  85.         {
  86.                 if(fwrite(buffer,sizeof(buffer),1,fp))
  87.                         {
  88.                         fflush(fp);
  89.                         }
  90.                 else printf("failure........\n");
  91.         }
  92.         else
  93.         {
  94.                 fclose(fp);
  95.                 break;
  96.         }
  97.     }

  98. }

复制代码

[ 本帖最后由 seawand_zhu 于 2007-9-11 11:32 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-09-11 11:24 |只看该作者
请求各位帮助,用fwrite函数向文件中写数据时,总会在重复最后一部分内容。

论坛徽章:
0
5 [报告]
发表于 2007-09-11 11:24 |只看该作者
怎么着也得把代码弄好看点吧?

论坛徽章:
0
6 [报告]
发表于 2007-09-11 11:25 |只看该作者
LZ还是把代码编辑到顶楼把...

论坛徽章:
0
7 [报告]
发表于 2007-09-11 15:35 |只看该作者
已经解决了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP