Stringstream to string logic C ++

时间:2010-11-26 20:32:16

标签: c++ stringstream

header.h

#include <iostream>
#include <vector>

class CombatLine{   
    std::stringstream Line;    
    std::vector<std::string> TokenLine;  
    void SetLine(std::string s){   
        Line<<s;   
    }    
public:   
void SetTokenLine(){   
    int i=0;    
    while(i<5){   
        Line>>TokenLine[i];   
        i++;}      
    TokenLine.resize(i);   
    for(int j=0;j<5;j++)   
        cout<<TokenLine[j];} 

的main.cpp

#include "Header.h"
using namespace std;   

int main () {   
    CombatLine Line1;   
    Line1.SetLine("[Combat] A bird attacks -Anthrax- and misses (dodge).");   
    Line1.SetTokenLine();   
}   

这构建但我收到此运行时错误/cygdrive/C/Program Files/NetBeans 6.9.1/ide/bin/nativeexecution/dorun.sh: line 33: 4500 Segmentation fault <core dumped> sh "$<SHFILE>"

我知道这与我操纵字符串的方式有关。 SetTokenFile中的流,但我似乎无法确定是什么。

这是一个较大项目的一小部分。总的来说,我将解析一个动态文本文件,然后对整个文件的内容进行比较。

2 个答案:

答案 0 :(得分:5)

您无法直接写入TokenLine[i],因为它已在vector构造函数中初始化为空CombatLine。如果在读取每一行时构建向量,则不需要resize

试试这个:

void SetTokenLine(){   
    int i=0;    
    string nextLine;
    while(i<5){   
        Line>>nextLine;
        TokenLine.push_back(nextLine);
        i++;}      
    for(int j=0;j<5;j++)   
        cout<<TokenLine[j];}

或者,您可以在默认的vector构造函数中预先分配CombatLine中的5个条目,但如果要处理的令牌数量发生变化,这会很脆弱。如果0&lt; = i&lt; = 4,则可以使用以下内容直接从stringstream直接写入TokenLine[i]

CombatLine::CombatLine() : TokenLine(5)
{
}

答案 1 :(得分:1)

你需要首先调整TokenLine的大小,然后写入内容,或者更好的习惯是使用push_back,必要时会调整大小。