2010-11-26 4 views
0

header.hStringstream для строки логики C++

#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

** Пожалуйста, ** используйте коды кода markdown вместо HTML при форматировании кода; в противном случае такие вещи, как каждый `<` в вашем блоке кода, удаляются (не говоря уже о том, что генерируется недействительный HTML). (Кроме того, ** использование пространства имен std; ** должно умереть от ужасной смерти) – 2010-11-26 20:35:45

ответ

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];} 

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

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

Большое спасибо! – Malaken 2010-11-27 03:22:19

1

Вы должны сначала изменить размер TokenLine, а затем записать в содержание, или лучше привычка использовать push_back, который при необходимости изменит размер.

+0

Спасибо вам большое! – Malaken 2010-11-27 03:20:52

Смежные вопросы