C++/64-bit
Expert: vijayan - 12/29/2011
QuestionHi,
How are you?
I have written a script for a 32-bit machine (Ubuntu). I'm now compiling it for a 64-bit machine (RedHat). My code doesn't work and I have narrowed the reason down to fscanf() and fprintf() functions.
This is my 32-bit version which works:
float readFloat=0.0;
fscanf(myfile,"%f", &readFloat);
fprintf(newfile,"%f\n", readFloat);
On 64-bit I only get 0.0 back. They say that for 64 you should use %lf (long float). However I don't know how to declare long float, I only know double or long double.
This also works on 32-bit:
double readFloat=0.0;
fscanf(myfile,"%lf", &readFloat);
fprintf(newfile,"%lf\n", readFloat);
However, again this won't work on 64-bit. What is the right way to do it so that it would work on both 32 and 64-bit? If this is impossible, how to do it correctly on 64-bit alone?
Also, do I only need to worry about the floating point when going from 32-bit to 64-bit, or also the int.
Thanks so much.
Sincerely,
Andres
Answer> What is the right way to do it so that it would work on both 32 and 64-bit?
When printing out a float or a double value with the printf family of functions, always use %f
When reading in a a float value with the scanf family of functions, use %f; for reading a double use %lf.
The above applies to all platforms.
float f ;
scanf( "%f", &f ) ;
double d ;
scanf( "%lf", &f ) ;
Of course you can elide this entire issue by using C++ streams and formatted input/output - they provide robust and type-safe mechanisms to write or read data.
Brief Explanation (from c-faq.com)
----------------------------------
Due to the ``default argument promotions'' (which apply in variable-length argument lists such as printf's, whether or not prototypes are in scope), values of type float are promoted to double, and printf therefore sees only doubles. (printf does accept %Lf, for long double.)
scanf, on the other hand, accepts pointers, and no such promotions apply. Storing into a float (via a pointer) is very different from storing into a double, so scanf distinguishes between %f and %lf. %f tells scanf to expect a pointer-to-float, and %d tells it to expect a pointer-to-double.
(Strictly speaking, %lf is undefined under printf, though many systems probably accept it. To be portable, always use %f.)