Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Writing a double type value to a text file

The below code is writing unreadable characters to the text file:

int main () 
{
    ofstream myfile ("example.txt");

    if (myfile.is_open())
    {
        double value       = 11.23444556;
        char   *conversion = (char *)&value;
        strcat (conversion, "\0");

        myfile.write (conversion, strlen (conversion));
        myfile.close();
    }   

    return 0;
}

I want to see the actual number written in the file :( Hints please.

EDIT Seeing the answers below, I modified the code as:

int main () 
{
    ofstream myfile ("example.txt");

    if (myfile.is_open())
    {
        double value       = 11.23444556;

        myfile << value;
        myfile.close();
    }   

    return 0;
}

This produces the putput: 11.2344 while the actual number is 11.23444556. I want the complete number.

Editing the post to notify everyone: The unreadable characters are due to ofstream's write function:

This is an unformatted output function

This quote is from: http://www.cplusplus.com/reference/iostream/ostream/write/

like image 797
Aquarius_Girl Avatar asked Jun 03 '11 10:06

Aquarius_Girl


3 Answers

Others suggested better ways but if you really want to do it the pointer way there should be casts to convert char* to double * and vice versa

#include <iostream>
#include <fstream>
#include <string>
#include <cstring>
using namespace std;

int main () 
{
  ofstream myfile ("example.txt");
  if (myfile.is_open())
  {
    double value       = 11.23444556;
    char     *conversion = reinterpret_cast<char *>(&value);
    strcat (conversion, "\0");
    //myfile.write (*conversion, strlen (conversion));
    myfile << *(reinterpret_cast<double *>(conversion));
    myfile.close();
  }
  return 0;
}
like image 108
Umut Tabak Avatar answered Nov 14 '22 21:11

Umut Tabak


Why don't you simply do this (updated answer after the edit in the question):

 #include <iomanip>

 myfile << std::fixed << std::setprecision(8) << value;
 myfile.close();

Now, you can see the actual number written in the file.

See the documentation of std::setprecision. Note: you have to include the <iomanip> header file.

like image 29
Nawaz Avatar answered Nov 14 '22 21:11

Nawaz


It's easier here to use the stream operators:

#include <iostream>
#include <fstream>
#include <string.h>
using namespace std;

int main () 
{
    ofstream myfile ("example.txt");

    if (myfile.is_open())
    {
        double value       = 11.23444556;

        myfile << value;
        myfile.close();
    }   

    return 0;
}

gives you what you want.

like image 3
MGwynne Avatar answered Nov 14 '22 23:11

MGwynne