我在程序中执行了以下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到循环限制?
答案 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次迭代。