C ++ stringstream –参考和使用教程

时间:2020-02-23 14:29:53  来源:igfitidea点击:

C ++ stringstream是字符串上的流类。
这使我们可以采用字符串并将其视为流对象,例如cin或者cout。

因此,我们可以使用" <<"和" >>"来执行诸如间接和向外等操作。

让我们看看如何使用此类轻松解析字符串。

创建一个字符串流对象

我们可以转换一个字符串,并创建一个stringstream对象。

但是在此之前,我们需要包含相关的头文件,可以在<sstream>头文件中获得该头文件。

#include <sstream>

创建对象非常简单。
相关的类型是stringstream,我们需要在构造函数中输入一个字符串。

#include <iostream>
#include <string>
#include <sstream>

//We use the std:: namespace,
//otherwise we need to specify the
//stringstream using std::stringstream
using namespace std;

int main() {
  //Input string
  string input_string = "Hello from theitroad";
 
  //Create the stringstream from the input string
  stringstream ss(input_string);

  cout << "Created a stringstream object\n";

  return 0;
}

输出

Created a stringstream object

目前,我们还没有使用stringstream对象。
现在,让我们看一下如何从流中读取或者写入。

读入C ++字符串流

与cin类似,我们可以使用>>操作符执行此操作,以从stringstream中读取字符串。

当我们使用字符串初始化stringstream对象时,该字符串的内容将被视为类似于流的对象。

string word;

//Read from the stringstream into word
ss >> word;

cout << word << endl;

因此,无论何时从流中读取,我们都会得到一个字符串!此方法的优点是它会自动解析定界符,例如空格,逗号等。

在使用定界符进行解析之后,我们可以使用stringstream来解析输入字符串并获取字符串数组!

#include <iostream>
#include <string>
#include <sstream>

//We use the std:: namespace,
//otherwise we need to specify the
//stringstream using std::stringstream
using namespace std;

int main() {
  //Input string
  string input_string = "Hello from theitroad";
 
  //Create the stringstream from the input string
  stringstream ss(input_string);

  cout << "Created a stringstream object\n";
  
  //To store the words that we get back from the stringstream
  string words[5];

  string buffer;
  
  int i = 0;

  while (ss >> buffer) {
      words[i] = buffer;
      cout << "Buffer: " << buffer << endl;
      i++;
  }

  //Print the tokenized set of strings from words[]
  cout << "Printing the tokenized array of strings\n";
  for (int j = 0; j < i; j++) {
      cout << words[j] << endl;
  }

  return 0;
}

其中我们使用ss >> buffer检查流是否为空。
如果ss不为空,它将写入buffer并进入循环体。
否则,它将仅从循环中退出。

由于我们的输入字符串包含空格,因此删除空格后,输出将是字符串的标记化列表。

输出

Created a stringstream object
Buffer: Hello
Buffer: from
Buffer: theitroad
Printing the tokenized array of strings
Hello
from
theitroad

写入stringstream

与从流中读取类似,我们也可以写入流中,就像cout &lt;&lt;一样!

与我们之前的示例不同,我们无需使用构造函数初始化stringstream对象,而只需声明它,然后再写它即可!

//Input string
string input_string = "Hello from theitroad";

//Create an empty stringstream object
stringstream ss;

ss << input_string;

因此,我们将获得与以前相同的输出,但现在我们也已将其写入流中!

#include <iostream>
#include <string>
#include <sstream>

//We use the std:: namespace,
//otherwise we need to specify the
//stringstream using std::stringstream
using namespace std;

int main() {
  //Input string
  string input_string = "Hello from theitroad";
 
  //Create the stringstream from the input string
  stringstream ss;

  cout << "Created a stringstream object\n";
  
  //To store the words that we get back from the stringstream
  string words[5];

  string buffer;

  ss << input_string;
  
  int i = 0;

  while (ss >> buffer) {
      words[i] = buffer;
      cout << "Buffer: " << buffer << endl;
      i++;
  }

  //Print the tokenized set of strings from words[]
  cout << "Printing the tokenized array of strings\n";
  for (int j = 0; j < i; j++) {
      cout << words[j] << endl;
  }

  return 0;
}

输出

Created a stringstream object
Buffer: Hello
Buffer: from
Buffer: theitroad
Printing the tokenized array of strings
Hello
from
theitroad

清除C ++字符串流

假设您要擦除当前在ss上的任何内容,有一个简单的功能:

ss.clear();

这只是清除缓冲区中存在的任何内容。

#include <iostream>
#include <string>
#include <sstream>

//We use the std:: namespace,
//otherwise we need to specify the
//stringstream using std::stringstream
using namespace std;

int main() {
  //Input string
  string input_string = "Hello from theitroad";
 
  //Create the stringstream from the input string
  stringstream ss;

  cout << "Created a stringstream object\n";
  
  //To store the words that we get back from the stringstream
  string words[5];

  string buffer;

  ss << input_string;
  
  int i = 0;

  while (ss >> buffer) {
      words[i] = buffer;
      cout << "Buffer: " << buffer << endl;
      i++;
  }

  //Print the tokenized set of strings from words[]
  cout << "Printing the tokenized array of strings\n";
  for (int j = 0; j < i; j++) {
      cout << words[j] << endl;
  }

  ss.clear();

  if (ss >> buffer) {
      cout << "Stream is not empty: Contains " << buffer << endl;
  }
  else {
      cout << "Stream is empty!\n";
  }

  return 0;
}

输出

Created a stringstream object
Buffer: Hello
Buffer: from
Buffer: theitroad
Printing the tokenized array of strings
Hello
from
theitroad
Stream is empty!

我们使用if(ss >> buffer)检查流实际上是否为空。
由于结果是false,因此我们确实清除了字符串流!