我对程序的执行方式感到困惑。我正在循环以下过程:
1)从输入文件中获取课程名称
2)输出课程名称的长度
问题是第一个值总是小于字符串的实际值。
我的第一个字符串包含13个字符(包括冒号),但Coq
返回12.下一个字符串,字符数为16,实际上nameOfClass.length()
返回16.
之后的每个值也会返回预期值,它只是第一个返回预期值减去1的值。
这是(减少的)代码:
nameOfClass.length()
文件看起来像这样(courseNames.txt):
std::ifstream inf("courseNames.txt");
int numberOfClasses = 10;
string nameOfClass;
for (int i = 0; i < numberOfClasses; i++) {
std::getline(inf, nameOfClass,':');
std::cout << nameOfClass.length() << "\n";
}
这就是我得到的:
Pre-Calculus:
Public-Speaking:
English I:
Calculus I:
...etc. (6 more classes)
任何人都可以解释12
16
10
11
函数的这种行为吗?
答案 0 :(得分:9)
你有问题,但你得出了错误的结论。 std::getline
读取但不输出分隔符,因此第一个结果确实是12。
它也不输出任何后续行的分隔符,为什么还有一个呢?好吧,看看之后的 :
。这是对的,一条新线!
Pre-Calculus:
^ a new line
因此,除第一个字符串外,您的nameOfClass
变量始终在其他字符之前存储一个额外的换行符。
修复很简单,只需在读取字符串后忽略换行符。
inf.ignore(); // ignore one character
所以,不是第一个结果是错的,它是唯一正确的结果:)