C ++ stringstream –参考和使用教程
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 <<
一样!
与我们之前的示例不同,我们无需使用构造函数初始化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,因此我们确实清除了字符串流!