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