I'd like to have a helper function log that essentially does the following:
log(file, "array has %d elements\n", 10);
// writes "2014-02-03 16:33:00 - array has 10 elements" to &file
I have the time portion down, and I have the file writing portion down. However, the problem is the method signature itself for log — what should I put? This says that the printf declaration ends with the ... keyword, but how can I use this in my function?
void log(FILE *f, const char * format, ...) // how would I pass ... to fprintf?
Let me EDIT this to include a bit more information.
I have a const char * now () that returns a string of the form "2014-02-03 16:33:00." I would like to pass another format string in like this. The two statements should be equivalent:
log(file, "array has %d elements\n", 10);
fprintf(file, "%s - array has %d elements\n", now(), 10);
I know that vfprintf allows me to pass a va_list, but how can I put the now() as the first argument, before all the others?
The va_list may be passed as an argument to another function, but calling va_arg() within that function causes the va_list to have an indeterminate value in the calling function. As a result, attempting to read variable arguments without reinitializing the va_list can have unexpected behavior.
Variable number of arguments in C++Define a function with its last parameter as ellipses and the one just before the ellipses is always an int which will represent the number of arguments. Create a va_list type variable in the function definition. This type is defined in stdarg. h header file.
ISO C defines a syntax for declaring a function to take a variable number or type of arguments. (Such functions are referred to as varargs functions or variadic functions.)
Use vprintf, which is declared as:
int vprintf(const char *format, va_list ap);
In your log function, invoke va_start to obtain a va_list value, then pass that value to vprintf.
Since your log function takes a FILE* argument, you'll probably want to use vfprintf rather than vprintf (and perhaps update your question to ask about fprintf rather than printf).
Incidentally, you might want to reconsider using the name log; that's the name of a standard function declared in <math.h>.
Reflecting your updated question, you can print the timestamp inside log by calling fprintf directly:
va_list(args);
fprintf(f, "%s - ", now());
va_start(args, format);
vfprintf(f, format, args);
                        The method you are looking for is vfprintf or possible vprintf (unclear which by your question) 
This is essentially the implementation of printf that allows a va_list to be explicitly passed in as a parameter.  So in your method you can create the va_list for your method parameters and forward it onto vfprintf
void log(FILE* f, const char* format, ...) { 
  va_list args;
  va_start (args, format);
  vfprintf (f, format, args);
  va_end (args);
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With