2013-09-17 2 views
1

Я получаю случайные числа после запуска строки convert >> quarter, я полагаю, что мне нужно очистить строку, прежде чем я запустил ее для преобразования снова, но как бы я это сделал? И может ли кто-нибудь объяснить, что происходит во время: (я нашел это как решение, но не совсем понимаю)Преобразование строки в int

stringstream convert(tokens[1]); 
    convert >> quarter; 

-

Play parse(string toParse){ 
    vector<string> tokens; 
    string play = toParse; 
    string oName, dName; 
    int x, quarter, minutes, down, yardstogo, startloc, playdesc; 
    for(int y=0; y<10; y++){ 
     x = toParse.find(","); 
     tokens.push_back(toParse.substr(0,x)); 
     toParse = toParse.substr(x+1); 
    } 
    stringstream convert(tokens[1]); 
    convert >> quarter; 
    convert.str(tokens[2]); 
    convert >> minutes; 
    convert.str(tokens[6]); 
    convert >> down; 
    convert.str(tokens[7]); 
    convert >> yardstogo; 
    convert.str(tokens[8]); 
    convert >> startloc; 
    playdesc = findPlay(tokens[9]); 
    Play a(quarter, minutes, tokens[4], tokens[5], down, yardstogo, startloc, playdesc, play); 
    return a; 
} 

Спасибо.

+0

Как очистить stringstream (чрезвычайно) для поиска: HTTP://stackoverflow.com/questions/20731/in-c-how-do-you-clear-a-stringstream-variable – chris

+0

Вам не нужно очищать его, потому что вы повторно инициализируете его с помощью 'convert.str (...) '. – Barmar

+0

Я надеялся, что объясню это, Крис. Бармар, ты знаешь, что я тогда получу плохие значения? Квартал и минуты - это оба ints, когда я конвертирую строку четверти в int, это успешно, когда я конвертирую минуты, я получаю очень большое число. –

ответ

1

Если вы продолжаете делать это таким образом, вам нужно позвонить ясно() после вызова ул():

stringstream convert(tokens[1]); 
convert >> quarter;    // Conversion 1 
convert.str(tokens[2]); 
convert.clear(); 
convert >> minutes;    // Conversion 2 
... 

Проблема заключается в том, что первое преобразование считывает всю строку, а это значит, что он устанавливает iostate потока к eof. Вызов str() не сбрасывает iostate. Вы должны сделать это вручную.

В вашем коде iostate является eof во всех последующих преобразованиях, поэтому никакое преобразование даже не пыталось.

0

Возможно, вы должны использовать функцию atoi(), которая быстрее, чем метод преобразования строк.

Нравится так:
quarter = atoi (токены [1] .c_str());
minutes = atoi (токены [2] .c_str());
...

С уважением

0

Вы можете просто использовать функцию <string> Стой (C++ 11) ...

quarter = stoi(tokens[1]) 
Смежные вопросы