課程設計 檔案輸入輸出精度

2021-10-03 06:58:15 字數 4225 閱讀 9148

方法一:c++檔案流定義讀取檔案,但發現沒有讀到小數(我也不知道為什麼)

fstream infile1;//定義檔案流物件

infile1.open("image_elements.txt", ios::in);//開啟外方位元素的文件

double *ptr1 = &data1[0][0];

while (!infile1.eof())

infile1.close();

方法二:c語言定義檔案讀取,可以讀到小數部位

ifstream file1("image_elements.txt");

if (!file1.is_open())

for (int i = 0; i < 6; i++)

}

//setiosflags(ios::fixed):設定浮點數以固定的小數字數顯示 

//setprecision(2):是設定浮點數的精度為2位。

cout << setiosflags(ios::fixed) << setprecision(2) << "xp=" << xp << endl;

cout << setiosflags(ios::fixed) << setprecision(2) << "yp=" << yp << endl;

cout << setiosflags(ios::fixed) << setprecision(2) << "zp=" << zp << endl;

注意:前提是不要忘了加預編譯頭#include,用cout以一定精度輸出。

#include#include#include#include#includeusing namespace std;

using namespace cv;

int main()

; double data2[42][2] = ;

//開啟外方位元素檔案

ifstream file1("image_elements.txt");

if (!file1.is_open())

for (int i = 0; i < 6; i++) }

//左右像片的外方位元素

double xs1 = data1[0][0];

double ys1 = data1[0][1];

double zs1 = data1[0][2];

double phi1 = data1[0][3];

double omig1 = data1[0][4];

double xs2 = data1[1][0];

double ys2 = data1[1][1];

double zs2 = data1[1][2];

double phi2 = data1[1][3];

double omig2 = data1[1][4];

//開啟像平面檔案

file *fp2;

ifstream file2("data_point.txt");

if (!file2.is_open())

for (int i = 0; i < 42; i++) }

//同名像點的座標

double x1 = data2[0][0] / 1000.0;

double y1 = data2[0][1] / 1000.0;

double x2 = data2[1][0] / 1000.0;

double y2 = data2[1][1] / 1000.0;

cout << "zs2=" << zs2 << endl;

cout << "y2=" << y2 << endl;

//定義基線分量

double bx = xs2 - xs1, by = ys2 - ys1, bz = zs2 - zs1;

//兩張像片上的旋轉矩陣

double a3 = -1.0*sin(phi1)*cos(omig1);

double b3 = -1.0*sin(omig1);

double c3 = cos(phi1)*cos(omig1);

//定義旋轉矩陣r1

mat r1(3, 3, cv_64f, 0.0);

r1.at(0, 0) = a1;

r1.at(0, 1) = a2;

r1.at(0, 2) = a3;

r1.at(1, 0) = b1;

r1.at(1, 1) = b2;

r1.at(1, 2) = b3;

r1.at(2, 0) = c1;

r1.at(2, 1) = c2;

r1.at(2, 2) = c3;

double aa3 = -1.0*sin(phi2)*cos(omig2);

double bb3 = -1.0*sin(omig2);

double cc3 = cos(phi2)*cos(omig2);

//定義旋轉矩陣r2

mat r2(3, 3, cv_64f, 0.0);

r2.at(0, 0) = aa1;

r2.at(0, 1) = aa2;

r2.at(0, 2) = aa3;

r2.at(1, 0) = bb1;

r2.at(1, 1) = bb2;

r2.at(1, 2) = bb3;

r2.at(2, 0) = cc1;

r2.at(2, 1) = cc2;

r2.at(2, 2) = cc3;

//定義同名像點的像空間輔助座標系rr1(x1,y1,z1)和rr2(x2,y2,z)

mat rr1(3, 1, cv_64f, 0.0);

mat rr2(3, 1, cv_64f, 0.0);

mat rr11(3, 1, cv_64f, 0.0);

rr11.at(0, 0) = x1;

rr11.at(1, 0) = y1;

rr11.at(2, 0) = -1 * f;

mat rr22(3, 1, cv_64f, 0.0);

rr22.at(0, 0) = x2;

rr22.at(1, 0) = y2;

rr22.at(2, 0) = -1 * f;

rr1 = r1*rr11;

double x1 = rr1.at(0, 0);

double y1 = rr1.at(1, 0);

double z1 = rr1.at(2, 0);

rr2 = r2*rr22;

double x2 = rr2.at(0, 0);

double y2 = rr2.at(1, 0);

double z2 = rr2.at(2, 0);

//計算左右點投影係數

double n1 = (bx*z2 - bz*x2) / (x1*z2 - z1*x2);

double n2 = (bx*z1 - bz*x1) / (x1*z2 - z1*x2);

//計算模型點座標

double detex = n1*x1;

double detey = 0.5*(n1*y1 + n2*y2 + by);

double detez = n1*z1;

//計算地面點的地面座標(x,y,z)

double xp = xs1 + detex;

double yp = ys1 + detey;

double zp = zs1 + detez;

cout << "地面點座標是:" << endl;

//setiosflags(ios::fixed):設定浮點數以固定的小數字數顯示

//setprecision(2):是設定浮點數的精度為2位。

cout << setiosflags(ios::fixed) << setprecision(2) << "xp=" << xp << endl;

cout << setiosflags(ios::fixed) << setprecision(2) << "yp=" << yp << endl;

cout << setiosflags(ios::fixed) << setprecision(2) << "zp=" << zp << endl;

//std::cout << rr1 << std::

getchar();

system("pause");

return 0;

}

檔案輸入 輸出

13.1 和檔案進行通訊 文字檢視和二進位制檢視 在文字檢視中,程式看到的內容和二進位制的內容可能不同,例如ms dos文字檔案用回車符和換行符的組合 r n來表示行尾,macintosh用乙個回車符 r來表示行尾。c程式使用乙個 n表示行尾。所以,如果c程式以文字檢視模式處理乙個ms dos文字檔...

檔案輸入輸出

檔案的兩種檢視 文字和二進位制。有的時候同乙個檔案以不同的檢視進行檢視,顯示是不同的,主要是控制字元 回車,換行 的不同。printf 是將各種型別轉換為適合的終端字元。所以打算將乙個結構體送入檔案的話不能用printf這一類函式。二進位制形式儲存,中間沒有從數字到字串形式的轉化。對於標準io,fr...

檔案輸入輸出

當我們求解acm題目時,通常在設計好演算法和程式後,要在除錯環境 例如vc等 中執行程式,輸入測試資料,當能得到正確執行結果後,才將程式提交到oj中。但由於除錯往往不能一次成功,每次執行時,都要重新輸入一遍測試資料,對於有大量輸入資料的題目,輸入資料需要花費大量時間。使用freopen函式可以解決測...