file - c program not writing same result as it is displaying -


my c program not writing file same data displaying. how save outputted screen in file. trying save webpage, file name defined third option, [site] [page] [path]

#include <stdio.h> #include <sys/socket.h> #include <arpa/inet.h> #include <stdlib.h> #include <netdb.h> #include <string.h>  int create_tcp_socket(); char *get_ip(char *host); char *build_get_query(char *host, char *page); void usage();  #define host "coding.debuntu.org" #define page "/" #define port 80 #define useragent "htmlget 1.0" #define os "mac osx"  int main(int argc, char **argv) {   struct sockaddr_in *remote;   int sock;   int tmpres;   char *ip;   char *get;   char buf[bufsiz+1];   char *host;   char *page;   char *htmlfile;    if(argc == 1){     usage();     exit(2);   }     host = argv[1];   if(argc > 2){     page = argv[2];   }else{     page = page;   }   htmlfile = argv[3];    sock = create_tcp_socket();   ip = get_ip(host);   fprintf(stderr, "<!--\nip %s\n", ip);   remote = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *));   remote->sin_family = af_inet;   tmpres = inet_pton(af_inet, ip, (void *)(&(remote->sin_addr.s_addr)));   if( tmpres < 0)     {     perror("can't set remote->sin_addr.s_addr");     exit(1);   }else if(tmpres == 0)   {     fprintf(stderr, "%s not valid ip address\n", ip);     exit(1);   }   remote->sin_port = htons(port);    if(connect(sock, (struct sockaddr *)remote, sizeof(struct sockaddr)) < 0){     perror("could not connect");     exit(1);   }   = build_get_query(host, page);   fprintf(stderr, "nquery is:\n<<start>>\n%s<<end>>\n-->\n", get);    //send query server   int sent = 0;   while(sent < strlen(get))   {     tmpres = send(sock, get+sent, strlen(get)-sent, 0);     if(tmpres == -1){       perror("can't send query");       exit(1);     }     sent += tmpres;   }   //now time receive page   memset(buf, 0, sizeof(buf));   int htmlstart = 0;   char * htmlcontent;   while((tmpres = recv(sock, buf, bufsiz, 0)) > 0){     if(htmlstart == 0)     {       /* under conditions not work.       * if \r\n\r\n part splitted 2 messages       * fail detect beginning of html content       */       htmlcontent = strstr(buf, "\r\n\r\n");       if(htmlcontent != null){         htmlstart = 1;         htmlcontent += 4;       }     }else{       htmlcontent = buf;     }     if(htmlstart){       fprintf(stdout, "%s", htmlcontent);     }      file *f;     f = fopen(htmlfile, "w");     fprintf(f, "%s", htmlcontent); //stderr, "%s"     fclose(f);      memset(buf, 0, tmpres);   }   if(tmpres < 0)   {     perror("error receiving data");   }   free(get);   free(remote);   free(ip);   close(sock);   return 0; }  void usage() {   fprintf(stderr, "usage: htmlget host [page]\n\ \thost: website hostname. ex: coding.debuntu.org\n\ \tpage: page retrieve. ex: index.html, default: /\n"); }   int create_tcp_socket() {   int sock;   if((sock = socket(af_inet, sock_stream, ipproto_tcp)) < 0){     perror("can't create tcp socket");     exit(1);   }   return sock; }   char *get_ip(char *host) {   struct hostent *hent;   int iplen = 15; //xxx.xxx.xxx.xxx   char *ip = (char *)malloc(iplen+1);   memset(ip, 0, iplen+1);   if((hent = gethostbyname(host)) == null)   {     herror("can't ip");     exit(1);   }   if(inet_ntop(af_inet, (void *)hent->h_addr_list[0], ip, iplen) == null)   {     perror("can't resolve host");     exit(1);   }   return ip; }  char *build_get_query(char *host, char *page) {   char *query;   char *getpage = page;   char *tpl = "get /%s http/1.0\r\nhost: %s\r\nuser-agent: %s\r\n\r\n";   if(getpage[0] == '/'){     getpage = getpage + 1;     fprintf(stderr,"removing leading \"/\", converting %s %s\n", page, getpage);   }   // -5 consider %s %s %s in tpl , ending \0   query = (char *)malloc(strlen(host)+strlen(getpage)+strlen(useragent)+strlen(os)+strlen(tpl)-5);   sprintf(query, tpl, getpage, host, useragent);   return query; //  file *f; //  f = fopen(htmlfile, "w"); //  fprintf(f, htmlcontent); //  fclose(f);  } 

here saving file:

file *f; f = fopen(htmlfile, "w"); fprintf(f, "%s", htmlcontent); //stderr, "%s" fclose(f); 

here result saves question (this page)

(['_setcustomvar', 1, 'tags', '|c|file|networking|']);  _gaq.push(['_trackpageview']);     var _qevents = _qevents || [];     (function () {         var ssl='https:'==document.location.protocol,             s=document.getelementsbytagname('script')[0],             ga=document.createelement('script');         ga.type='text/javascript';         ga.async=true;         ga.src=(ssl?'https://ssl':'http://www')+'.google-analytics.com/ga.js';         s.parentnode.insertbefore(ga,s);         var sc=document.createelement('script');         sc.type='text/javascript';         sc.async=true;         sc.src=(ssl?'https://secure':'http://edge')+'.quantserve.com/quant.js';         s.parentnode.insertbefore(sc,s);     })();     _qevents.push({ qacct: "p-c1rf4kxgluznc" });     </script>          </body> </html> 

file *f; f = fopen(htmlfile, "w"); fprintf(f, "%s", htmlcontent); //stderr, "%s" fclose(f); 

rather opening , closing file each time through loop, should open once before loop, keep open while you're writing it, close after loop.


Comments

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -