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.
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
Posting Komentar