std::stringstream - 字符串到数字工作
std::stringstream - string to number working
我正在学习 C++,我对以下代码的工作原理有疑问。我的目标是从命令行接受数字(作为 std::string),用空格分隔并将这些数字与字符串分开。我发布了另一个与此相关的问题,并使用下面的代码使程序运行。你能给我解释一下数字是如何从字符串中提取出来的吗?
string gradesFullLine;
getline(cin, gradesFullLine);
stringstream gradeStream(gradesFullLine);
for(gradeStream >> grade; gradeStream; gradeStream >> grade) {
grades.push_back(grade);
}
下面是编写循环的更简单方法:
while(gradeStream >> grade) {
grades.push_back(grade);
}
工作原理如下:
gradeStream >> grade
调用 operator>>(std::istream, int)
(或任何数字类型 grade
)。这会尝试 "extract" 来自流的数字,并更新 "stream state" 指示成功或失败。
- 表达式
gradeStream >> grade
的结果,即 operator>>(std::istream, int)
的 return 值,是 gradeStream
本身。
- 任何标准流都有一个等效于
operator bool() const
的方法,它允许您在布尔上下文中使用流,例如 if()
或 while()
条件。如果流是 "good",则此运算符 return 为真,这意味着它没有任何 I/O 错误(包括读取流的末尾)。
- 所以使用布尔值作为
while
条件,意思是只要gradeStream
有一个"good state"就会进入循环,也就是说grade
有填充了从流中提取的数字(这种提取如何发生由您的特定系统实现定义)。
我正在学习 C++,我对以下代码的工作原理有疑问。我的目标是从命令行接受数字(作为 std::string),用空格分隔并将这些数字与字符串分开。我发布了另一个与此相关的问题,并使用下面的代码使程序运行。你能给我解释一下数字是如何从字符串中提取出来的吗?
string gradesFullLine;
getline(cin, gradesFullLine);
stringstream gradeStream(gradesFullLine);
for(gradeStream >> grade; gradeStream; gradeStream >> grade) {
grades.push_back(grade);
}
下面是编写循环的更简单方法:
while(gradeStream >> grade) {
grades.push_back(grade);
}
工作原理如下:
gradeStream >> grade
调用operator>>(std::istream, int)
(或任何数字类型grade
)。这会尝试 "extract" 来自流的数字,并更新 "stream state" 指示成功或失败。- 表达式
gradeStream >> grade
的结果,即operator>>(std::istream, int)
的 return 值,是gradeStream
本身。 - 任何标准流都有一个等效于
operator bool() const
的方法,它允许您在布尔上下文中使用流,例如if()
或while()
条件。如果流是 "good",则此运算符 return 为真,这意味着它没有任何 I/O 错误(包括读取流的末尾)。 - 所以使用布尔值作为
while
条件,意思是只要gradeStream
有一个"good state"就会进入循环,也就是说grade
有填充了从流中提取的数字(这种提取如何发生由您的特定系统实现定义)。