如何使用ifstream

时间:2016-11-12 09:55:58

标签: c++ ifstream

我的程序有问题,基本上是一个简单的数学程序。它做了一些向量乘法和向量矩阵乘法,它确实工作正常,直到我尝试从文本中读取数据。我可以编译程序但是当我尝试执行它时,我得到了错误:" 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中,因为它告诉我内容已经改变,但是当我重新加载文件时,它仍然是空的。

2 个答案:

答案 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获取数据时,程序确实有效。 我真的不知道为什么程序不起作用!