2011-03-07 49 views
9

我试图将字符串流中的数据存储到向量中。我可以成功地做到这一点,但它忽略了字符串中的空格。我如何做到这一点,所以空间也被推入矢量?C++:stringstream向量

谢谢!

代码存根:

#include <iostream> 
#include <sstream> 
#include <vector> 

using namespace std; 

int main() 
{ 
    stringstream s; 
    string line = "HELLO HELLO\0"; 

    stringstream stream(line); 

    unsigned char temp; 
    vector<unsigned char> vec; 
    while(stream >> temp) 
     vec.push_back(temp); 


    for (int i = 0; i < vec.size(); i++) 
     cout << vec[i]; 
    cout << endl; 
    return 0; 
} 
+1

如果您将空间视为您要放入矢量中的项目的一部分,那么将如何将一个项目与另一个项目分开? – James 2011-03-07 23:10:15

+2

请说明您是否希望您的媒介包含(1)每个字符一个条目,(2)每个以空格分隔的“单词”一个条目,或(3)包含所有内容的单个条目;如果(2),你想要什么空白去? [编辑添加:哦,等等,这是_unsigned char_的向量?哎呀,对不起。] – 2011-03-07 23:14:20

+0

@Gareth或(4)每行一个字 – user470379 2011-03-07 23:15:47

回答

14

你为什么要使用stringstreamstring复制到vector<unsigned char>您的代码并不需要它,因为它具有using namespace std;在顶部,但其他人可能选择不这样做。]你可以这样做:

vector<unsigned char> vec(line.begin(), line.end()); 

并且会直接复制。如果您需要使用stringstream,则首先需要使用stream >> noskipws

+0

+1 - 非常优雅的解决方案 – RageD 2011-03-07 23:25:23

+0

为什么不适用于'矢量'? – 2015-11-14 05:18:59

2

我倾向于使用你真正想要的容器建议只,但你也可以使用机械手noskipws

this关于stringstream的和其他方法的详细信息你可以除了提取运算符使用

编辑:

还要考虑std::copystd::basic_string<unsigned char>为简单起见。

3

默认情况下,标准流全部跳过空白。如果你想使用noskipws操纵像这样禁用的空白跳过你可以明确地这样做的下一个流萃取(>>)操作:

stream >> std::noskipws >> var; 
+2

请注意,noskipws是持久的;它不仅适用于“下一个流提取”,还适用于该流的所有后续操作,直到您执行某些操作来取消它。为了让读者明白代码的意图,最好做一下“stream >> std :: noskipws;”作为一个单独的声明,而不是将其包含在一个特定的提取中(除非你在单个链路上打开和关闭它,为了清楚起见,我建议你不要这样做。) – 2011-03-07 23:23:21

+0

ahhh,谢谢,忘记了那部分。我很难保持直接哪些只会影响下一个操作,哪些不会影响下一个操作,因为我不使用流I/O太多......主要是由于缺少低级错误检查和报告。 – diverscuba23 2011-03-08 06:57:40

1

您希望noskipws操纵。说出stream >> std::noskipws;,然后再把东西拉出来。

[编辑添加的std::前缀,我愚蠢地省略。