我的for循环执行的次数比预期的多

时间:2010-11-24 03:13:55

标签: c++ loops

我在程序中执行了以下for循环,我看不出它的设计与我收到的输出有什么关系。

cout << no_of_lines << endl;
for (int count = 0; count < no_of_lines + 1; count ++)
{
    getline(Device, line, '=');
    cout << line << endl;
}

这是输出:

3
DeviceName
GPU
Manufacturer
Intel
GraphicalRam
128MB

这是文件DeviceList

DeviceName=GPU
Manufacturer=Intel 
GraphicalRam=128MB

在循环中,no_of_lines指的是文件中的行数,在本例中为3.我提供此输出作为验证,即循环每行只执行一次。谁能告诉我为什么这个循环执行的次数比预期的多?我猜这是因为我将=作为分隔符,并且循环在某种程度上在递增之前执行了额外的时间,但是为什么它会在最后一行的deliminator上停止,需要我添加1到循环限制?

4 个答案:

答案 0 :(得分:5)

http://www.cplusplus.com/reference/string/getline/是您的朋友。文档说当将删除字符传递给getline时,它会读取Delem char或找到文件结尾。 '\ n'没有区别对待。一旦找到了删除字符,它就会丢弃它并填充,直到该点为止。下次你打电话给getline时,它会继续从它离开的地方读取。所以在这种情况下,每个调用如下所示。

DeviceName
GPU\nManufacturer
Intel\nGraphicalRam
128MB\n
上面字符串中的

'\ n'基本上是换行符。它不是真正的反斜杠,后跟n(2个字符)。它只是一个换行符'\ n'。出于理解目的,我就这样使用它。

为清楚起见,这里是完整的代码(已编译和测试)。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int no_of_lines = 3;
    string line;
    cout << no_of_lines << endl;
    for (int count = 0; count < no_of_lines + 1; count++)
    {
        getline(cin, line, '=');
        cout << line << endl ;
    }
    return 0;
}

到现在为止,我希望你明白为什么需要4次拨打getline。

答案 1 :(得分:4)

你的循环执行no_of_lines+1次。

我假设您希望分隔符为'='。但是,当分隔符为'='时,\n不是分隔符。因此line将包含\n(例如,在第二个getline上)。因此显示的行数不等于循环执行的次数。

答案 2 :(得分:1)

当您使用=作为行分隔符时,\n 用作行分隔符。

所以你得到包含换行符的字符串

当您输出这样的字符串时,它会显示为两行或更多行(由于它包含的换行符)。

干杯&amp;第h。,

答案 3 :(得分:0)

你希望它计算三次,但你的循环计数为0,1,2,3,4,即5次迭代。