我的程序有问题,基本上是一个简单的数学程序。它做了一些向量乘法和向量矩阵乘法,它确实工作正常,直到我尝试从文本中读取数据。我可以编译程序但是当我尝试执行它时,我得到了错误:" Dataname.exe不起作用"。 这是我的代码。不要考虑cins和couts
#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中,因为它告诉我内容已经改变,但是当我重新加载文件时,它仍然是空的。
答案 0 :(得分:0)
第一个代码示例中有几件事情应该以不同的方式完成。程序首先打开文件,并在变量n
中计算文件中7个数字的块数。然后重置文件指针,创建三个大小为n
的向量,并将第一个n
数字从文件中读入向量。但是:您不必事先知道向量中的条目数,因此不需要两次读取该文件。只需使用vector::push_back
添加数字。
第二个问题:在读取数字的循环中,a
用作循环变量,即double
。增加一个double可能会导致一次性错误,从而解释您的崩溃。
我也不确定逻辑是否正确:看起来你希望文件有几行(n
)数字,每行有7个数字,但是你读了第一个n
数字。假设您有10行,那么您将第一行和第二行的三个数字读入向量中,您也可能想要读取所有数字或者每行的第一行(甚至是3d结构)。
您从cin
读取的第二个代码示例怎么样?这个有用吗?如果你解释了你想要做什么,它可能有所帮助,似乎文件中有矢量,你想要采用矢量产品(Kreuzprodukt)?它们在文件中的布局是什么,是用行还是列写的?
编辑:崩溃的原因似乎是这一行:
for (a = 0;a<n;a++);
{
einlesen>>vecein.at(a);
...
注意循环后的;
。这导致循环首次运行时没有任何语句,并且当循环条件不再满足时,括号内的部分随后运行,即a
已经等于n
。
答案 1 :(得分:0)
我已经尝试过你的建议,但它仍然无法运作。我没有改变我读取数据的方式,因为我想看看它是否先工作。 这是我的错误消息: 在抛出&#39; std :: out_of_range&#39;的实例后终止调用 what():vector :: _ M_range_check:__n(10)&gt; = this-&gt; size()(10)
此应用程序已请求Runtime以不寻常的方式终止它。 请联系应用程序的支持团队以获取更多信息。
我的代码现在看起来像这样:
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获取数据时,程序确实有效。 我真的不知道为什么程序不起作用!