2016-11-12 66 views
-2

我有一個問題,我的程序基本上是一個簡單的數學程序。它做了一些向量乘法和向量矩陣乘法,它工作正常,直到我嘗試從文本中讀取數據。我可以編譯該程序,但是當我嘗試執行它時,出現錯誤:「Dataname.exe不起作用」。 這是我的代碼。不考慮cins和couts如何使用ifstream

#include<iostream> 
#include<cmath> 
#include<vector> 
#include"header.hpp" 
#include<fstream> 
using namespace std; 

int main() 
{ 
    ifstream einlesen ("Zahlen.dat"); //function "einlesen" opens the file "Zahlen.dat". 
    if (einlesen) // Message if the file has been opend 
    cout<<"Daten wurden eingelesen"<<endl; 
    else { 
    cout<<"Konnte Daten nicht einlesen"<<endl; 
    return 99; 
    } 

    double a; 
    int n{0}; 

    while (einlesen >>a>>a>>a>>a>>a>>a>>a) n++;//Loop copys datas on a 

    einlesen.clear();//stops the loop after the last data is copied. 
    einlesen.seekg(0, ios_base::beg);//?? 

    vector<double> vecein(n), vecein1(n),Matrixein(n); 
    for (a = 0;a<n;a++);//copys datas to a vector further calculations 
    { 
    einlesen>>vecein.at(a); 
    einlesen>>vecein1.at(a); 
    einlesen>>Matrixein.at(a); 
    } 

    double Matrix1[9]; //defining my Matrix and the coordinates of my vectors. 
    double x,y,z,x_1,x_2,x_3; 
    vector<double> vec(3); 
    vector<double> vec1(3); 

    // Old code where I read the data with `cin`: 
    /*cout<<"Geben Sie die x Koordinaten ein:"<<endl; 
    cin>>vec[0]; 
    cin>>vec1[0]; 

    cout<<"Geben Sie die y Koordinaten ein:"<<endl; 
    cin>>vec[1]; 
    cin>>vec1[1]; 

    cout<<"Geben Sie die z Koordinaten ein:"<<endl; 
    cin>>vec[2]; 
    cin>>vec1[2]; 

    cout<<"Geben Sie eine Matrix ein"<<endl; 
    cin>>Matrix1[0]>>Matrix1[1]>>Matrix1[2]>>Matrix1[3]>>Matrix1[4]>>Matrix1[5]>>Matrix1[6]>>Matrix1[7]>>Matrix1[8]; 

    cout<<"Vektor1:<"<<vec[0]<<","<<vec[1]<<","<<vec[2]<<">"<<endl; 
    cout<<"Vektor2:<"<<vec1[0]<<","<<vec1[1]<<","<<vec1[2]<<">"<<endl; 

    vector<double> Addition(3); 
    Addition = Vektoraddition(vec,vec1); 
    cout<<"Addition:"<<"<"<<Addition[0]<<","<<Addition[1]<<","<<Addition[2]<<">"<<endl; 

    double Skalarprodukt; 
    Skalarprodukt = Skalarpr(vec,vec1); 

    cout<<"Skalarprodukt:"<<Skalarprodukt<<endl; 
    vector<double> kreuzprodukt(3); 
    kreuzprodukt = Kreuzprodukt (vec,vec1); 
    cout<<"Kreuzprodukt:"<<"<"<<kreuzprodukt[0]<<","<<kreuzprodukt[1]<<","<<kreuzprodukt[2]<<">"<<endl; 

    vector<double> MatrixVektor(3); 
    MatrixVektor = Matrix_vektor (Matrix1, vec); 
    cout<<"Matrix*Vektor:"<<"<"<<MatrixVektor[0]<<","<<MatrixVektor[1]<<","<<MatrixVektor[2]<<">"<<endl;*/ 

    ofstream ausgabe ("Ausgabe.dat");//write the data on Ausgabe.dat 
    for (int i = 0; i < a; i++) 
    { 
    ausgabe << "(" << vecein[i] << "," << vecein1[i] << "," << Matrixein[i]<<")" << endl; 
    } 
    return 0; 
} 

它是用德語寫的,所以我不會對變量名感到疑惑。我的問題是,我不太明白我在while循環中做什麼。 Zahlen.dat是一個類似於1 2 3 4 5 6 7的文件...而Ausgabe.dat是一個空文件。實際上它的確在Ausgabe.dat中寫入,因爲它告訴我內容已經改變,但是當我重新加載文件時它仍然是空的。

+1

您可以嘗試縮進並更清晰地格式化您的代碼嗎?並用它出現在源代碼中的相同語言報告錯誤消息,以便我們可以知道哪一行拋出錯誤? – Davislor

+0

如果輸入文件沒有打開,並且你不能說出原因,一種技術是在程序的頂部「#include '和'#include ',然後,在錯誤信息是'cerr << __FILE__ <<':'<< __LINE__ <<「:」<< strerror(errno)<< endl;'代替。我的大部分程序都有一個類似的宏。 – Davislor

回答

0

第一個代碼示例中有幾件事情應該以不同的方式完成。程序首先打開文件,然後在變量n中計算文件中7個數字塊的數量。然後重置文件指針,創建三個大小爲n的向量,並將第一個n數字讀入文件的向量中。但是:您不必事先知道矢量中的條目數量,因此無需兩次讀取該文件。只需使用vector::push_back即可添加數字。

第二個問題:在讀取數字的循環中,使用a作爲循環變量,它是double。加倍增加可能會導致一次性錯誤,從而解釋您的崩潰。

我也不確定邏輯是正確的:看起來你期望文件有幾個(n)行數,每個數有7個數字,但是你讀了第一個n數字。假設你有10條線,那麼你可以讀第二行的第一行和第三行到你的向量中,也可能想讀取所有數字或者每行的第一行(甚至是3d結構)。

第二個代碼示例如何從cin中讀取?那個工作?如果你解釋了你正在做的事情,它可能會有所幫助,看起來文件中有矢量,你想要使用矢量產品(Kreuzprodukt)?他們在文件中的佈局是什麼,他們是按行還是列寫的?

編輯:令人崩潰似乎是這一行:

for (a = 0;a<n;a++); 
{ 
    einlesen>>vecein.at(a); 
    ... 

通知的;循環之後。這導致循環首先運行而沒有任何語句,並且當循環條件不再滿足時,括號內的部分繼續運行,即a已經等於n

0

我試過你的建議,但它仍然無法正常工作。我沒有改變我閱讀數據的方式,因爲我想先看看它是否工作。 這是我的錯誤信息: 在拋出'std :: out_of_range'的實例後終止調用 what():vector :: _ M_range_check:__n(它是10)> = this-> size()(它是10)

此應用程序已請求運行時以不尋常的方式終止它。 有關更多信息,請聯繫應用程序的支持團隊。

我的代碼看起來像現在這種權利:

int main() 

{ 



ifstream einlesen ("Zahlen.dat"); 

if (einlesen) 



cout<<"Daten wurden eingelesen"<<endl; 



else 

{ 

cout<<"Konnte Daten nicht einlesen"<<endl; 

return 99; 

} 



double a; 

int n{0}; 

while (einlesen >>a>>a>>a>>a>>a>>a>>a) n++; 

{ 
einlesen.clear(); 

einlesen.seekg(0, ios_base::beg); 

vector<double> vecein(n), vecein1(n),Matrixein(n); 

int b;// new variable of type int. 
for (b = 0;b<n;b++); 

{ 

einlesen>>vecein.at(b); 

einlesen>>vecein1.at(b); 

einlesen>>Matrixein.at(b); 

} 

ofstream ausgabe ("Ausgabe.dat"); 

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

{ 

    ausgabe << "(" << vecein[i] << "," << vecein1[i] << "," << Matrixein[i]  <<")" << endl; 

} 
} 
return 0; 

所以我基本上只改變了循環的變量。 是的,當我用cin獲取數據時,程序確實工作。 我真的不知道爲什麼程序不工作!

+0

剛剛看到它:在這個版本和原始版本中都有''''語句後面的';',因此'for'語句之後的代碼塊沒有針對循環的每次迭代運行,但之後。在這一點上,循環變量已經等於'n',所以你的向量訪問超出了界限,這導致了崩潰(除了循環沒有完成預期的功能外)。順便說一句,找到這種錯誤的好方法是調試器。嘗試使用一個來逐步通過每一行,以輕鬆找到這樣的錯誤。 –

+0

非常感謝!它終於工作了!下一步是將這些數字定義爲矢量,但我會先自己嘗試。謝謝! – gamma