跳转至

Streams

Stringstream

C++
1
2
3
4
5
6
7
int main() {
    ostringstream oss("Ito-En Green Tea");
    cout << oss.str() << endl;
    oss << "haha";
    cout << oss.str() << endl;
    return 0;
}

这段程序执行的结果是:

Text Only
1
2
Ito-En Green Tea
hahaEn Green Tea

这是因为stringstream有一个位置指针,当在执行oss << "haha";的时候,指针没有在末尾。我们可以做出如下改动:

C++
1
2
3
4
5
6
7
int main() {
    ostringstream oss("Ito-En Green Tea", ostringstream::ate);
    cout << oss.str() << endl;
    oss << "haha";
    cout << oss.str() << endl;
    return 0;
}
Text Only
1
2
Ito-En Green Tea
Ito-En Green Teahaha

这样指针就是在末尾向后移动。

在C++中,istringstream 对象的读取是顺序进行的,每次读取操作都会从当前位置开始,直到遇到空白字符或流的末尾。因此,如果你在同一个 istringstream 对象上进行多次读取操作,每次读取操作都会从上一次读取结束的位置继续。

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int main() {
    istringstream iss("16.9 Ounces");
    double amount;
    string unit;

    iss >> amount;
    iss >> unit;

    cout << amount/2 << endl;
    cout << unit << endl;
    return 0;
}
Text Only
1
2
8.45
Ounces

注意下面的区别:

C++
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
int main() {
    istringstream iss("16.9 Ounces");
    double amount;
    string unit;

    iss >> amount;
    iss >> unit;

    cout << amount << " " << unit << endl;

    return 0;
}

其输出结果是:

Text Only
1
16.9 Ounces

而将double改为int,结果则变为:

Text Only
1
16 .9

对于istringstream的抓取更准确的说法是:它会抓去尽可能多的有意义的字符。在这里,当其遇到小数点的时候,他认为这不能变成int的一部分,故停止抓取。

下图十分直观:

alt text

alt text

stringstream v.s. string

alt text