我来自C#,Java背景,试图学习C ++。以下是我发现的用于读取结构变量值的片段。无法弄清楚正在做什么或者这是否是读取字符串结构成员的标准方法。是不是有更清洁的方法来做到这一点。
string mystr;
struct structdefn
{
string member;
...
} mystruct[10];
...
getline (cin,mystr);
stringstream(mystr) >> mystruct[n].member;
答案 0 :(得分:4)
该代码使用一个临时的stringstream
,其中包含从stdin读取的行,以将数据读入struct成员。虽然您可能会有一些原因(例如检查>>
运营商消耗整条线路),但通常您可以更简单地执行此操作
cin >> mystruct[n].member;
关于你的代码的解释:
getline
从cin
(标准输入流)中读取整行并将其放入string
mystr; stringstream
的临时对象; stringstream
是一种特殊类型的流,不是从文件/套接字/任何内容提供的,而是来自string
。在这种情况下,字符串是mystr
,该行只是从标准输入中读取的; >>
,在此上下文中称为提取运算符 1 ;它的工作是从流中提取并转换将放在其右侧变量中的数据,在本例中为mystruct[n].member
。我发布的更简单的代码只是直接从标准输入流(>>
)使用运算符cin
,从而避免stringstream
的中间通过。
<小时/> 1.虽然有整数,但它是二元右移运算符(它的原始含义)。
答案 1 :(得分:2)
假设mystr
和mystruct[n].member
都是std::string
个实例,我不确定为什么使用stringstream
- 你应该能够直接读到member
字符串。
#include <iostream>
#include <string>
// Assuming that mystruct[n].member is a std::string
std::getline ( std::cin, mystruct[n].member );
拥有mystruct
结构的声明会更有帮助。
修改强>:
如果您正在阅读并存储到结构成员中的数据不是整行文本,则可以使用stringstream
。提取运算符>>
将从字符串中一次提取“单词”,其中空格分隔文本行中的“单词”。例如:
// Where the line of text is "123 abc pdq" ...
std::string s;
std::getline ( std::cin, s ); // s now contains: 123 abc pdq
std::stringstream ss ( s );
ss >> mystruct[n].member; // member will contain: 123
有一些方法可以改变关于如何处理空格的流的行为,但这是将一串文本的一部分提取到其他字符串中最常用的方法。
答案 2 :(得分:1)
std :: stringstream类对于复杂的字符串格式化(比如printf,但是类型安全),以及在字符串和其他类型之间进行转换非常有用。
例如,在Java中使用Integer.parseInt的地方,你可以在C ++中使用std :: stringstream。
int i;
std::stringstream("123") >> i;
如果您不需要进行转换,并且不需要字符串格式化,那么您可能不需要字符串流。