编辑: 我现在明白我的疑惑了。我不明白为什么第一个值(N,值的数量)在while循环的开始时没有被读取,而这是发生在我当时没有意识到的一个非常简单的原因。 它发生,因为它是之前阅读,在该行:带while和for循环的I/O
ifile >> n;
我认为在while循环的文件读取会重新从头开始,而不是从最后一次读取的行开始。
对不起,如果我以前不清楚。我希望我现在。
我有表示从实验的测量结果列表的文件,这样的:
N
x_1 y_1 ex_1 ey_1
x_2 y_2 ex_2 ey_2
... ... ... ...
其中N是值的数量,并且X_1,X_2,...,值他们自己。 我必须把这些值在某些阵列所以我想这个while循环:
int n;
double d,e,f,g;
while (ifile >> d >> e >> f >> g){
x[n]=d;
y[n]=e;
ex[n]=f;
ey[n]=g;
n++;
}
但是,当我编译时,我看到的第一个值(N,这是值的数量)被放入第一数组,所以,因为我必须对测量进行计算,所以我不能使用它。 我发现,通过使用该for循环:
int n;
ifile >> n;
for(int i=0; i<n; i++) {
ifile >> x[i];
ifile >> y[i];
ifile >> ex[i];
ifile >> ey[i];
}
和打印出的阵列,“N”没有被读,并且读出从第一值开始。为什么? (X,Y,EX,EY是动态数组)
这是整个代码:
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main() {
int n;
ifstream ifile("pendulum.dat");
if(!ifile){
cout << "Error in file opening" << endl;
return 1;
}
ifile >> n;
double* x = new double[n];
double* y = new double[n];
double* ex= new double[n];
double* ey= new double[n];
double* py= new double[n];
double* pey=new double[n];
for(int i=0; i<n; i++) {
ifile >> x[i];
ifile >> y[i];
ifile >> ex[i];
ifile >> ey[i];
py[i]=pow(y[i],2);
pey[i]=2*(ey[i]/y[i])*pow(y[i],2);
}
double S0=0,Sx=0,Sy=0,Sxx=0,Sxy=0;
for(int i=0;i<n;i++){
S0 = S0 + 1/pow(pey[i],2);
Sx = Sx + (x[i]/pow(pey[i],2));
Sy = Sy + py[i]/pow(pey[i],2);
Sxx = Sxx + pow(x[i],2)/pow(pey[i],2);
Sxy = Sxy + (x[i]*py[i])/pow(pey[i],2);
}
double a,b,ea,eb;
a=((Sxy*S0)-(Sx*Sy))/((Sxx*S0)-(Sx*Sx));
ea=sqrt((S0)/((Sxx*S0)-(Sx*Sx)));
b=((Sy*Sxx)-(Sx*Sxy))/((Sxx*S0)-(Sx*Sx));
eb=sqrt((Sxx)/((Sxx*S0)-(Sx*Sx)));
cout <<"Value of a is "<< a<<" +- "<<ea<< endl;
cout <<"Value of b is "<< b<<" +- "<<eb<< endl;
double g,eg;
double k=4*pow(M_PI,2);
g=k/a;
eg=k*ea;
cout<<"Value of g is "<<g<<" +- "<<eg<< endl;
ifile.close();
return 0;
}
我觉得这行应该在for循环之前添加。 'ifile >> n' –
我忘了在问题中复制那个(和'int n;'),但是它们在代码 – Lorenzo
中的代码是否工作?如果不是,请尝试用'ios :: binary'打开文件! –