我正在编写一个涉及从文件中读取大量数据的程序,我遇到了一个两难的境地(成为一个相对缺乏经验的程序员)。如果while循环包含在另一个while循环中,需要满足哪些条件才能离开循环? 我的具体情况如下所示(emptyLineFound是一个布尔值,当找到空行时设置为true)
while(!file.eof()) {
....
while(!emptyLineFound) {
....
}
}
哪个条件优先?他们都必须满意地离开那部分代码吗?例如,如果它在文件的末尾并且由于没有线而找不到空行,那么它会搞砸吗?
答案 0 :(得分:3)
退出时,嵌套时不必满足这两个部分。
while(!file.eof()) {
当文件不在流的末尾时,将继续运行。
while(!emptyLineFound) { .... }
在找不到空行时将继续运行。
一旦找到空行,您将退出嵌套循环,父循环将继续,直到满足条件(达到EOF)。
答案 1 :(得分:1)
While(ExitCondition)
{
// you are at this point if ExitCondition fails .
while(another-ExitCondition)
{
// you are at this point if another-ExitCondition fails
}
// you will come at this point once another-ExitCondition becomes true
}
// you will be at this point once ExitCondition becomes true .
答案 2 :(得分:0)
在您的问题中,内部循环将在emptyLineFound
为true
时结束。外部循环将继续,直到file.eof()
为true
。据推测,内循环中的某些内容会在下一个循环之前将emptyLineFound
设置为false
。
请注意,条件会在代码到达时进行测试,所以理论上你可以这样:
while(!file.eof())
{
while(!emptyLineFound)
{
... do some reading ...
if (file.eof())
{
... reset file so we can do more reading ...
}
}
}
并且循环将永远持续,除非从循环的最开始file.eof()
为真。
顺便说一句,一般来说,使用!file.eof()
作为循环控件是一个非常糟糕的主意。使用读取操作本身要好得多,例如while (file >> var) ...
- 因为while (!file.eof())
往往导致额外的迭代,因为file.eof()
在您读完PAST结束之前不是真的。
答案 3 :(得分:0)
每次重复外循环时,内循环都会重新进入并重新开始。
答案 4 :(得分:0)
如果表达不同,代码可能会变得清晰:
void f()
{
// ...
while (!file.eof()) {
// ...
}
}
int main()
{
// ...
while (!emptyLineFound) {
f();
}
}
这在语义上与您的程序相同;它具有相同的整体逻辑。
从这里开始,你可以清楚地看到f()的调用在f.eof()为真之前不会终止,而main将重复调用f()(从而执行“内部”循环)直到emptyLineFound是的。