0

我有一个任务,我必须从文件中读取并对其执行各种计算并将答案写入输出文件。一切都很顺利,直到我走到这一步:

“重新读取文件并计算文件中整数的总和,只要总和不超过 1000。使用标志控制的循环结构。”

我的代码片段如下:

dataFile2.close();
dataFile2.clear();
dataFile2.open("J:\\datafile2.txt");

sum = 0;
while(sum < 1000)
{
    dataFile2 >> num;
    sum = sum + num;
    if(sum > 1000)
        sum = sum - num;
}

answers << "The sum of the integers not exceeding 1000 is " << sum << endl;
cout << "The sum of the integers not exceeding 1000 is " << sum << endl;
return 0;

我的变量已经被声明了。当我取出 if 语句时,总和加上最后一个数字,然后总和超过 1000。当保留 If 语句时,不执行答案和 cout 语句,也没有编译器警告或错误。

对此的任何帮助将不胜感激。

-ThePoloHobo

4

2 回答 2

1

因为似乎没有人想给你一个正确的答案......(公平地说,如果没有真正为你做你的工作,很难给出一个正确的答案)。

您的代码中有两个问题。第一个是您使用标志的要求。正如我在评论中所说,惯用的解决方案不会使用标志,但使用标志没有问题。标志是一个布尔变量,它将在 中进行测试 while,并且当您发现某些让您想要离开循环的东西时,它将在循环中的条件中设置。

第二个问题是您在使用num时没有检查输入是否成功。您必须在操作员之后>>进行检查 。惯用的检查方法(也是没有该语言经验的人应该使用的唯一方法)是将流视为布尔值:

dataFile2 >> num;
if ( dataFile2 ) {
    //  Input succeeded...
} else {
    //  Input failed for some reason, maybe end of file
}

由于流上的所有操作都返回对流的引用,因此通常合并测试和输入:

if ( dataFile2 >> num ) {
    //  succeeded
} else {
    //  failed
}

if(就个人而言,我发现在一个或一个可怕的条件下修改状态的想法while。但是这个习语是如此普遍,你可能应该使用它,原因很简单,这是每个人都期望的。)

在教学环境中,将任何失败都视为文件结尾可能是可以接受的,只需将测试移至while(当然,除非您被要求使用标志)。在其他情况下,您需要考虑这样一个事实,即失败可能是由于输入中的语法错误造成的——有人插入"abc"到您期望数字的文件中。有很多方法可以处理这个问题,所有这些都超出了您尝试执行的范围,但请注意,在检测到故障,您可以询问流以了解原因。特别是,如果 dataFile2.eof()是真的,那么失败是(可能)由于你已经阅读了所有的数据,一切都很好。(换句话说,读取数据失败不一定是错误。它可能只是文件结束。)

于 2013-03-25T09:22:39.670 回答
-1

您似乎没有使用标志变量,这在这种情况下可能会有所帮助。这样的事情应该解决它:

sum = 0;
bool sumUnder1000 = true; //Or the C++ equivalent, I'm a bit rusty
while(sumUnder1000)
{
    if(!dataFile2.good()){
        sumUnder1000 = false; //We've reached end of file or an error has occurred
        return;
    }
    dataFile2 >> num;
    sum = sum + num;
    else if(sum > 1000){
        sum = sum - num;
        sumUnder1000 = false;
    }
}
于 2013-03-24T21:32:59.313 回答