首页 > 解决方案 > 为什么第一次读取文件时字符串的长度会减少一个?

问题描述

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

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()函数的这种行为?

标签: c++

解决方案


你有问题,但你有错误的结论。std::getline读取但不输出分隔符,因此第一个结果确实是 12。

它也不会为任何后续行输出分隔符,那么为什么总是还有一个呢?好吧,看看之后是什么:。没错,新线!

Pre-Calculus:
             ^ a new line

所以你的nameOfClass变量,除了第一个字符串,总是在其他字符之前存储一个额外的换行符。

修复很简单,只需在读取字符串后忽略换行即可。

inf.ignore(); // ignore one character

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


推荐阅读