C++ 为什么在第一次读取文件时字符串的长度会减少1?

C++ 为什么在第一次读取文件时字符串的长度会减少1?,c++,C++,我对我的程序的执行方式感到困惑。我正在循环以下过程: 1) 从输入文件中获取课程名称 2) 输出课程名称的长度 问题是第一个值总是比字符串的实际值小一个 inf.ignore(); // ignore one character 我的第一个字符串包含13个字符(包括冒号),但nameOfClass.length()返回12个字符。下一个字符串,字符计数是16,实际上,nameOfClass.length()返回16 之后的每个值也返回期望值,只有第一个值返回期望值减去1 以下是(简化)代码:

我对我的程序的执行方式感到困惑。我正在循环以下过程:

1) 从输入文件中获取课程名称

2) 输出课程名称的长度

问题是第一个值总是比字符串的实际值小一个

inf.ignore(); // ignore one character
我的第一个字符串包含13个字符(包括冒号),但
nameOfClass.length()
返回12个字符。下一个字符串,字符计数是16,实际上,
nameOfClass.length()
返回16

之后的每个值也返回期望值,只有第一个值返回期望值减去1

以下是(简化)代码:

这就是我得到的:

12

16

10

11

有人能解释一下
.length()
函数的这种行为吗?

您有一个问题,但得出了错误的结论
std::getline
读取但不输出分隔符,因此第一个结果实际上是12

它也不会为任何后续行输出分隔符,所以为什么总是多出一行?好吧,看看后面是什么
。没错,一条新线路

Pre-Calculus:
             ^ a new line
因此,除了第一个字符串之外,您的
nameOfClass
变量总是在其他字符之前存储一个额外的换行符

修复非常简单,只需在读取字符串后忽略换行符

inf.ignore(); // ignore one character

因此,不是第一个结果是错误的,它是唯一正确的:)

Pre-calculation
有12个字符:)
int numberOfClasses==10
是一个打字错误,对吗?是的,但13包括“:”。我使用控制台输出进行了更新。输入文件中有10个类,我只是没有列出它们。我猜您是在windows上执行此操作的,并且您有\r\n作为回车符和换行符。又名,一条新的线路。所以它在:,之后和新行之前拾取一个字符。这解释了很多。谢谢Rakete1111。如果文件更新为在
之后包含其他字符,则必须使用
inf.ignore(std::numeric\u limits::max(),“\n”)
改为忽略
之后直到并包括换行符的所有内容。
inf.ignore(); // ignore one character