Konversi Angka Scientific ke Double dalam File dengan C++

Suatu hari, istri penulis mendapatkan data dalam bentuk file data.dat, dengan tiap data diberikan dalam bentuk angka scientific. Data tersebut seperti dibawah ini:

8.0488800e-01 -1.5277600e+01
8.0845880e-01 -1.5270800e+01
8.1202960e-01 -1.5250700e+01
8.1560039e-01 -1.5217400e+01
8.1917119e-01 -1.5171500e+01
8.2274199e-01 -1.5113700e+01
8.2631278e-01 -1.5045000e+01
8.2988358e-01 -1.4966600e+01
8.3345438e-01 -1.4880000e+01
8.3702518e-01 -1.4787100e+01
8.4059597e-01 -1.4690300e+01

Untuk keperluan perhitungan numerik, data diatas perlu dibaca dengan kode C++.

Ternyata, dalam perhitungan angka scientific tersebut perlu dirubah dahulu ke type data double.

Berikut ini adalah kode C++ untuk merubah angka scientific ke double, sebagai file kode.cpp, yang outputnya disimpan ke file lain, out.dat.

#include <iostream> 
#include <fstream> 
#include <string> 
#include <stdio.h> 
#include <cmath> 
#include <sstream> 
 
using namespace std; 
 
double sciToDub(const string& str) 
{ 
 try { 
  stringstream ss(str); 
  double d = 0; 
  ss >> d; 
  if (ss.fail()) { 
    return nan(""); 
  }else return d; 
   }catch (string& e) { 
      return nan(""); 
   } 
} 
 
int getNumData(string a) 
{ 
 int num=0; 
 ifstream myfile(a); 
 if (myfile.is_open()){ 
  while (myfile.good()) 
  { 
    string line; 
    getline(myfile,line); 
    stringstream ssin(line); 
    int j=0; 
    while(ssin.good() && j<1){ 
     string word; 
     ssin>>word; 
     if(!isnan(sciToDub(word)))j++; 
     else break; 
    } 
    if(j>0)num++; 
  } 
  myfile.close(); 
 } 
 return num; 
} 
 
int main(int argc, char *argv[]) 
{ 
 if(argv[1]==NULL || argv[2]==NULL){ 
  cout<<"Data not entered!"<<endl; 
  return 0; 
 } 

 double *x,*y; 
 int n=getNumData(argv[1]); 
 x=new (nothrow)double[n]; 
 y=new (nothrow)double[n]; 

 cout<<"Num data : "<<n<<endl; 

 ifstream myfile(argv[1]); 
 if (myfile.is_open()){ 
  int i=0; 
  while (myfile.good()) 
  { 
    string line; 
    getline(myfile,line); 
    stringstream ssin(line); 
    int j=0; 
    while(ssin.good() && j<2){ 
     string word; 
     ssin>>word; 
     double d=sciToDub(word); 
     if(!isnan(d)){ 
      if(j==0){ 
     x[i]=d; 
      }else{ 
     y[i]=d; 
      } 
      j++; 
     }else break; 
    } 
    if(j>0)i++; 
  } 
  myfile.close(); 
 }else cout << "Unable to open file"; 

 ofstream outfile; 
 outfile.open(argv[2]); 
 for(int i=0;i<n;i++){ 
  outfile<<x[i]<<" "<<y[i]<<endl; 
 } 
 outfile.close(); 

 return 0; 
} 

Penulis menggunakan compiler C++ untuk Windows MinGW, dengan kode kompilasi sebagaimana berikut:

g++ kode.cpp -o kode.exe
kode.exe data.dat out.dat

File out.dat adalah file output hasil konversi, dimana isinya kurang lebih seperti di bawah ini:

0.808459 -15.2708
0.81203 -15.2507
0.8156 -15.2174
0.819171 -15.1715
0.822742 -15.1137
0.826313 -15.045
0.829884 -14.9666
0.833454 -14.88
0.837025 -14.7871

Komentar