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

Kha*_*huu 2 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";
}
Run Code Online (Sandbox Code Playgroud)

该文件看起来像这样(courseNames.txt):

Pre-Calculus:
Public-Speaking:
English I:
Calculus I:

...etc. (6 more classes)
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

12

16

10

11
Run Code Online (Sandbox Code Playgroud)

任何人都可以解释这个.length()函数的行为吗?

Rak*_*111 9

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

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

Pre-Calculus:
             ^ a new line
Run Code Online (Sandbox Code Playgroud)

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

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

inf.ignore(); // ignore one character
Run Code Online (Sandbox Code Playgroud)

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

  • 如果文件被更新为包含`:`之后的其他字符,则必须使用`inf.ignore(std :: numeric_limits <std :: streamsize> :: max(),'\n');`在`:`之前忽略*所有*,包括换行符. (2认同)