2016-11-27 80 views
-4

编辑: 我现在明白我的疑惑了。我不明白为什么第一个值(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; 
    } 
+1

我觉得这行应该在for循环之前添加。 'ifile >> n' –

+0

我忘了在问题中复制那个(和'int n;'),但是它们在代码 – Lorenzo

+0

中的代码是否工作?如果不是,请尝试用'ios :: binary'打开文件! –

回答

2

您想

int n; 
ifile >> n; 
for(int i=0; i<n; i++) { 
    ifile >> x[i]; 
    ifile >> y[i]; 
    ifile >> ex[i]; 
    ifile >> ey[i]; 
} 

可能?

+0

我想你是对的! –

+2

@kiner_shah是的,这是纯粹的猜测;) –

+0

我忘了在问题中复制这两行。 – Lorenzo