c++ - 为什么第一次读取文件时字符串的长度会减少一个?
问题描述
我对我的程序的执行方式感到困惑。我正在循环以下过程:
1) 从输入文件中获取课程名称
2) 输出课程名称的长度
问题是第一个值总是比字符串的实际值小一个。
我的第一个字符串包含 13 个字符(包括冒号),但nameOfClass.length()
返回 12。下一个字符串,字符数为 16,实际上nameOfClass.length()
返回 16。
之后的每个值也返回预期值,只有第一个返回预期值减 1。
这是(简化的)代码:
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";
}
该文件如下所示(courseNames.txt):
Pre-Calculus:
Public-Speaking:
English I:
Calculus I:
...etc. (6 more classes)
这就是我得到的:
12
16
10
11
谁能解释.length()
函数的这种行为?
解决方案
你有问题,但你有错误的结论。std::getline
读取但不输出分隔符,因此第一个结果确实是 12。
它也不会为任何后续行输出分隔符,那么为什么总是还有一个呢?好吧,看看之后是什么:
。没错,新线!
Pre-Calculus:
^ a new line
所以你的nameOfClass
变量,除了第一个字符串,总是在其他字符之前存储一个额外的换行符。
修复很简单,只需在读取字符串后忽略换行即可。
inf.ignore(); // ignore one character
所以,不是第一个结果是错误的,它是唯一一个正确的:)
推荐阅读
- javascript - 应该在 ctx.lineTo 之前使用 ctx.moveTo
- python-3.x - 比较两个 NoneType 变量时遇到 TypeError 问题 - Python 3.6
- sql - Impala SQL - 获取最大时间戳记录 - 不产生结果
- winapi - SSD 上的逻辑块大小
- c# - 填充大文件时出现 PDFClown System.OutOfMemoryException
- dart - 在颤动中嵌套页面视图
- obiee - OBIE 中的字符匹配
- jquery - 如果“活动”类在前面,则将“活动”类添加到 TD
- cucumber - 如何为小黄瓜步骤传入命令行值
- javascript - 在 Webview 中更改相机