Solved

how do i log file in C++

Posted on 2014-12-26
10
292 Views
Last Modified: 2014-12-29
though im unfamilar with C++ & finally i have wrote such code like following with the refeneces of web,but i has failded,the program has been stoke & memory leak,i just cant figure out why

with the web page
https://gist.github.com/To0ki3/3886428
i add this hpp to my program,however it's memory leak,but if i commet the log file code,my program back to normal and works fine,in addition, Is there any problem that i used for a webservice to call this dll?im very concern the memory leak or other exception.im using vs 2013 paid version .

#1 cpgetadd.h
extern "C"
{
      __declspec(dllexport) int  __stdcall callwebaddr(const char * theurl);
}

//#2 cpgetadd.cpp
#include <stdio.h>
#include <curl/curl.h>
#include "cpgetadd.h"
#include <fstream>
#include<string>
#include "FileLogger.hpp"


#pragma comment(lib,"libcurldll.a")

using namespace std;

void write_text_to_log_file(const std::string &text);

int  __stdcall callwebaddr(const char * theurl)
{
      CURL *curl;
      CURLcode res;

      curl = curl_easy_init();
      if (curl)
      {
            curl_easy_setopt(curl, CURLOPT_URL, theurl);
            /* example.com is redirected, so we tell libcurl to follow redirection */
            curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

            /* Perform the request, res will get the return code */
            res = curl_easy_perform(curl);
            /* Check for errors */
            if (res != CURLE_OK)
            {
            //      fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
            //the follwing code will comes memory leak if i uncomment it      
            /*      ige::FileLogger myLog("1.0.4.2", "testfile.txt");

                  // Writing warnings or errors to file is very easy and C++ style
                  size_t slen=strlen(curl_easy_strerror(res))+1;
                  size_t  slenwadd = strlen(theurl) + 1;
                  char * errstr = new char[slen + slenwadd];
                  strcpy_s(errstr, slenwadd, theurl);
                  strcat_s(errstr, slen, curl_easy_strerror(res));
                  myLog << ige::FileLogger::e_logType::LOG_ERROR << errstr;
                  delete[] errstr;*/
                  curl_easy_cleanup(curl);
                  return -1;
            }
            else
            {
                    //the follwing code will comes memory leak if i uncomment it      
      /*            ige::FileLogger myLog("1.0.4.2", "testfile.txt");
                  size_t slenwadd = strlen(theurl) + 1;
            char * errstr = new char[ slenwadd + 8];
                  strcpy_s(errstr, slenwadd, theurl);
                  strcat_s(errstr,7, "success");
                  myLog << errstr;
                  delete[] errstr;
            */

                  curl_easy_cleanup(curl);
                  return 0;
            }

      }
       //the follwing code will comes memory leak if i uncomment it      
      /*ige::FileLogger myLog("1.0.4.2", "testfile.txt");
      size_t slenwadd = strlen(theurl) + 1;
      char * errstring = "initial failed";
      size_t slenstr = strlen(errstring) + 1;
      char * errstr = new char[slenwadd + slenstr];
      strcpy_s(errstr, slenwadd, theurl);
      strcat_s(errstr, slenstr,errstring);
      myLog << ige::FileLogger::e_logType::LOG_ERROR << errstr;
      delete[] errstr;
      delete[] errstring;*/
      return -2;

}

/*this is my another version of log file function,it occured error in std::end when i compile it,i just dont know how to resolve it.*/
/*
void write_text_to_log_file(const std::string &text)
{
      std::ofstream log_file(
            "log_file.txt", std::ios_base::out | std::ios_base::app);
      log_file << text << std::end;
}
*/

many thanks
best regards & happy new year
ken
0
Comment
Question by:ken yup
  • 5
  • 3
  • 2
10 Comments
 
LVL 84

Expert Comment

by:ozo
ID: 40519449
Did you mean std::endl ?
0
 

Author Comment

by:ken yup
ID: 40519548
look at this:
http://www.codeproject.com/Questions/97485/how-to-write-log-file-in-C
i copy the code from here,but it doesnt works
0
 

Author Comment

by:ken yup
ID: 40519550
the function of "void write_text_to_log_file(const std::string &text)" i copy from codeproject
0
 
LVL 84

Assisted Solution

by:ozo
ozo earned 125 total points
ID: 40519688
It looks like they meant to say endl too.
0
 

Author Comment

by:ken yup
ID: 40520152
ok,i'll try to change it,thanks
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
LVL 33

Assisted Solution

by:sarabande
sarabande earned 375 total points
ID: 40521567
however it's memory leak,but if i commet the log file my program back to normal and works fine
the code has much more problems than memory leaks. it is a mix of c and c++ where neither the one nor the other is used with care.

generally, if using std::string and std::ostream, you don't need to create char pointers or use functions like strcpy, strcpy_s, strcat, strlen, ....

if you don't use 'new' operator you won't create heap memory yourself and because of that your code would not have memory leaks.

(1) always initialize variables:

 
CURL *curl = NULL;
 CURLcode res = CURLE_OK;

Open in new window


(2) the logging code should be turned like that:

 ige::FileLogger myLog("1.0.4.2", "testfile.txt");

// Writing warnings or errors to file is very easy and C++ style
myLog << ige::FileLogger::e_logType::LOG_ERROR << "|" << curl_easy_strerror(res) << "|" << theurl << std::endl;

Open in new window


if the code throws an exception, you may check whether curl_easy_strerror(res) returns a non-null char pointer and whether theurl is valid.

generally, for c++ streams you don't need any helper char arrays or string concatenation. simply use the operator<< to add.

Sara
0
 

Author Comment

by:ken yup
ID: 40521679
thank you for your opinions,because i make this dll for powerbuilder legacy version,char * variable is equal string variable in powerbuilder,so i have to use char *,however char * is a C-style character.however i confuse with c & c++,i dont know how to write a dll for powerbuilder correctly.what should be aware.of course my knowledge of c++ is still not enough
0
 
LVL 33

Accepted Solution

by:
sarabande earned 375 total points
ID: 40521775
char * variable is equal string variable in powerbuilde
char * is a pointer to char. if it points to 1st element of a char array which has a zero-element to terminate the string it can be used instead of const std::string& because std::string has a constructor that takes a const char* as argument. additionally std::string has a member function c_str(), which you can use whenever a function needs a const char* type as argument or for the right side of an assignment. if a function needs a (writeable) char * buffer, you may do the following:

// define a string variable 
std::string strvar = "whatever value";
// resize it to maximum size needed.
strvar.resize(512); 
// call function that needs char* argument
function_requiring_writeable_char_pointer(&strvar[0], 512);
strvar.resize(strlen(strvar.c_str()));

Open in new window


Sara
0
 

Author Comment

by:ken yup
ID: 40521788
from your opinion i have another question:
as you metioned, i wrote the API code mixed with c & c++ sytanx,do you mean i should write the API in pure-C sytanx?
0
 
LVL 33

Assisted Solution

by:sarabande
sarabande earned 375 total points
ID: 40521834
i should write the API in pure-C sytanx?
i would recommend against that beside your requirement is to call the api from pure (ansi) c environments, what means that the projects were built by using c compiler rather than c++ compiler (what rarely is the case for nowadays projects). for all other projects an API using stl types as arguments (instead of pointers to arrays) is the better choice.

Sara
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Adobe Customization Wizard XI issues 26 208
FizzBuzz challenge 9 76
wordappend challenge 8 145
drawing animated level bar based on numbers 3 88
When writing generic code, using template meta-programming techniques, it is sometimes useful to know if a type is convertible to another type. A good example of when this might be is if you are writing diagnostic instrumentation for code to generat…
When we want to run, execute or repeat a statement multiple times, a loop is necessary. This article covers the two types of loops in Python: the while loop and the for loop.
This tutorial covers a step-by-step guide to install VisualVM launcher in eclipse.
The viewer will learn how to user default arguments when defining functions. This method of defining functions will be contrasted with the non-default-argument of defining functions.

912 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now