Stringstream для строковой логики C ++ - PullRequest
0 голосов
/ 26 ноября 2010

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 ]

5 голосов
/ 26 ноября 2010

Вы не можете писать напрямую в 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];}

В качестве альтернативы, вы можете предварительно выделить 5 записей в vector в конструкторе CombatLine по умолчанию, хотя это хрупко, если количество токенов, которые вы хотите обработать, изменяется. С помощью приведенного ниже вы можете писать прямо из stringstream в TokenLine[i], если 0 <= i <= 4. </p>

CombatLine::CombatLine() : TokenLine(5)
{
}
1 голос
/ 26 ноября 2010

Сначала необходимо изменить размер TokenLine, а затем ЗАПИСАТЬ содержимое, или лучше использовать push_back, который при необходимости изменит размер.

...