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

时间:2018-04-27 20:03:44

标签: c++

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

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

1 个答案:

答案 0 :(得分:9)

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

它也不输出任何后续行的分隔符,为什么还有一个呢?好吧,看看之后的 :。这是对的,一条新线!

Pre-Calculus:
             ^ a new line

因此,除第一个字符串外,您的nameOfClass变量始终在其他字符之前存储一个额外的换行符。

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

inf.ignore(); // ignore one character

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