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

design - Custom Styling Qt Quick Controls -

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