-2

感谢您阅读本文。我正在编写代码来读取大数据文件。我尝试使用 while 循环一次读取一篇。但是当我写

while(TimeStep++) 

它将在第一个循环中退出。如果我写,

while(TimeStep+=1)

会好的。另外,如果我初始化

int TimeStep=-1;

它将在第一个循环中退出。但是如果我初始化

int TimeStep=0;

没事的。while() 的魔力让我感到困惑。请帮助我理解while循环。

这是我所有的代码。

//get diffusion of all the particles in the 256Coordinate.txt file and diffusion of a single particle.

using namespace std;
typedef vector<double> vec;

int ReadStructure(vec & Coordinate,int size,ifstream & TrajectoryFile){
    double a;

    for(int i=0;i<size*3;i++){
        if(!(TrajectoryFile.eof())){
            TrajectoryFile>>a;
            Coordinate[i]=a;
        }
    }

    //cout<<Coordinate[1]<<endl;

    if(TrajectoryFile.eof()){
        return 1;
    } else {
        return 0;
    }
}



int main(){
    int ContinueFlag=0,i,j,k;
    double a,b,c;
    vec Coordinate;
    string filename= ("../256Coordinate.txt"); // a file that contains 256*5000*3 numbers
    int size=256;
    Coordinate.resize(size*3);
    int TimeStep=0;
    ifstream TrajectoryFile(filename.c_str());//open the .txt file and begin the read data
    //TrajectoryFile>>a;
    //cout<<a<<endl;

    while(TimeStep+=1){//keep looping untils breaks.
        ContinueFlag=ReadStructure(Coordinate,size,TrajectoryFile);//read the .txt file and store the values in the vector Coordinate[3*256]. Read 3
        *256 numbers at a time.
            // cout<<"ContinueFlag= "<<ContinueFlag<<endl;
            if(ContinueFlag==1) break;//if we reach the end of the file, exit.
        // cout<<Coordinate[1]<<endl;
    }

    cout<<"total number of timesteps= "<<TimeStep-1<<endl;
}
4

5 回答 5

1

循环体将在以下while时执行loop condition

while(loop condition)

true

所以如果你设置TimeStep =0开始。它将TimeStep ==0在执行while循环之前测试是否。任何非零值都被视为True。如果是0,则循环体将不会执行。

如果初始化为int TimeStep=-1;TimeStep+=1将设置TimeStep =0,相当于false,所以循环体不会执行。

如果您事先不知道循环终止条件,只需使用

 while (true)

比使用这样的TimeStep变量要好。

尝试:

 while(true){
    ContinueFlag=ReadStructure(Coordinate,size,TrajectoryFile);
    if(ContinueFlag==1) 
       break;
 }
于 2013-04-30T02:12:44.377 回答
1

在 C++ 中,整数值 0 为 False,任何其他值(包括负整数)为 True。当为 false 时,while 循环退出。

于 2013-04-30T02:13:11.287 回答
1

我认为您的主要问题是不了解while循环,而是了解增量运算符++

让我们看一个例子:

int x = 5;
int y = x++;

在这里,x会有一个值6(因为你做了++),但是y会有哪个值呢?其实会的5。这是一个所谓的“后增量”运算符:看,你先分配,然后再增加。

如果你写了这个

int x = 5;
int y = (x += 1);

然后你会x = 6像以前一样,但这次y = 6也是,所以你首先增加x,然后才将它分配给y.

这应该使您对while循环的误解消失:

int TimeStep = 0;
while(TimeStep++) 

在这里,TimeStep 得到 的值1,但只有它被用于while测试退出后,while才会看到旧值(如上y例所示),旧值是0,所以while立即退出。

int TimeStep = 0;
while(TimeStep+=1)

在这种情况下,循环继续进行,因为您首先增加了TimeStep然后让while测试它是否为非零。

我真的建议你写一个简单的循环,你为什么要测试是否TimeStep非零呢?这样做:

while(true) { // Infinite cycle, until brake is encountered
    TimeStep++;
}
于 2013-04-30T09:29:11.370 回答
0

while 循环需要一个true/false值,据此,TimeStep++如果TimeStep = -1false,因为TimeStep++将 1 加到TimeStep,所以 == 0,如果TimeStep = 0你加 1 则总是true,因为 true 是每个值!= 0...

于 2013-04-30T02:13:35.903 回答
0

我认为您可能需要更好地理解布尔代数。

这是教程http://www.electronics-tutorials.ws/boolean/bool_7.html的链接。

while 循环基于布尔表达式。如果 while 循环括号内的表达式为真,它将进​​入循环并停止,直到该表达式的计算结果为假。

它在您使用的整数设置为 0 或 1 时起作用,因为 0 代表假,1 代表真。如果整数不是 0 或 1,则不能将整数用作布尔表达式。

看起来您希望循环在 ContinueFlag==1 时中断。因此,只需将其用作 while 循环参数。另一种方法是将该代码更改为 while (true)。

由于您希望 ContinueFlag 至少设置一次(这样您就知道何时中断),我建议使用 do while 循环,该循环至少执行一次,然后在表达式为真时重复。

用这个:

do {
    ContinueFlag=ReadStructure(Coordinate,size,TrajectoryFile);
    TimeStep++; //This allows for TimeStep to increment
} while (ContinueFlag!=1); //It will loop while ContinueFlag!=1 which will cause  
                           //the loop to end when ContinueFlag==1 

这是编写代码的更好方法(与 while (true) 相反)。这使您可以轻松查看循环的目的。

于 2013-04-30T02:22:49.877 回答