感谢您阅读此内容。 我正在编写一个代码来读取大数据文件。我尝试使用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;
}
答案 0 :(得分:1)
while
循环将在loop condition
while(loop condition)
是true
。
因此,如果您将TimeStep =0
设置为开头。它将在执行while循环之前测试TimeStep ==0
是否为True
。任何非零值都被视为0
。如果是int TimeStep=-1;
,循环体将不会执行。
如果您初始化为TimeStep+=1
,TimeStep =0
将设置false
,这相当于 while (true)
,因此循环体不会执行。
如果您事先不知道循环终止条件,只需使用
TimeStep
比使用这样的 while(true){
ContinueFlag=ReadStructure(Coordinate,size,TrajectoryFile);
if(ContinueFlag==1)
break;
}
变量更好。
尝试:
{{1}}
答案 1 :(得分:1)
在C ++中,整数值0为False,包括负整数的任何其他值为True。虽然循环在错误时退出。
答案 2 :(得分: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
的值,但{/ 1}}仅使用 来测试退出,但while
会看到旧值(上例中为while
),旧值为y
,因此0
会立即退出。
while
在这种情况下循环继续,因为你首先递增int TimeStep = 0;
while(TimeStep+=1)
然后让TimeStep
测试它是否为非零。
我真的建议你写一个简单的循环,为什么你测试while
是否非零?就这样做:
TimeStep
答案 3 :(得分:0)
如果true
为false
,则while循环需要TimeStep++
/ TimeStep = -1
值false
,因为TimeStep++
添加1到TimeStep
,所以== 0,如果TimeStep = 0
并且你加1那么总是true
,因为每个值都是true!= 0 ...
答案 4 :(得分:0)
我认为你可能需要更好地理解布尔代数。
以下是教程http://www.electronics-tutorials.ws/boolean/bool_7.html的链接。
while循环基于布尔表达式。如果while循环括号内的表达式为true,它将进入循环并停止,直到该表达式的计算结果为false。
当您使用的整数设置为0或1时,它起作用,因为0表示false,1表示true。如果整数不是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))。这使您可以轻松查看循环的目的。