2015-03-20 2 views
0

Я новичок в C++ и пытаюсь найти какой-то примерный код для извлечения целых чисел из строк с разделителями-запятыми. Я сталкивалась с этим кодом:Синхронизация целого числа из строки с разделителями-запятыми

std::string str = "1,2,3,4,5,6"; 
std::vector<int> vect; 

std::stringstream ss(str); 

int i; 

while (ss >> i) 
{ 
    vect.push_back(i); 

    if (ss.peek() == ',') 
     ss.ignore(); 
} 

У меня есть проблемы с пониманием цикла While условного оператора: ss >> i. По моему мнению, istream::>> возвращает istream. Операция может быть установлена ​​битами ошибки. Кажется, что не существует логической переменной. Как может ss >> i служить условным заявлением?

Кроме того, делает >> извлечение одного или нескольких символов? Например, если у меня есть строка «13, 14». Эта операция возвращает целые числа 1, 3, 1, 4 или целые числа 13, 14?

Спасибо большое, M

ответ

1

1) Условное обозначение.

станд :: stringstream происходит от Std :: ИОС, который определяет:

  • В C++ 98/C++ 03: Оператор пустоты *() сопзЬ

Описание: пустой указатель если установлен хотя бы один из битбит или бадбит. Некоторое другое значение в противном случае.

  • В C++ 11: явный оператор BOOL() Const

Описание: не верно, если ни один из failbit или badbit устанавливается. false в противном случае.

Именно поэтому вы можете использовать это выражение как условие для оператора цикла. >> возвращает ссылку на объект stringstream, который затем преобразуется в указатель void * или bool, в зависимости от поддерживаемой версии C++.

Более подробную информацию об этом: std::ios::operator bool

2) оператор >> применяется для чисел извлекает столько символов, сколько он может:

int main() 
{ 
    std::string str = "111,12,1063,134,10005,1226"; 
    std::vector<int> vect; 

    std::stringstream ss(str); 

    int i; 

    while (ss >> i) 
    { 
     vect.push_back(i); 

     if (ss.peek() == ',') 
      ss.ignore(); 
    } 

    return 0; 
} 

Содержание вектора: [111, 12, 1063, 134, 10005, 1226].

Опять же, подробнее: std::istream::operator>>

2

Как ss >> i служить условного оператора?

Класс std::basic_ios (который является базовым классом для всех стандартных потоков) имеет explicit operator bool(), который возвращает !fail(). Суть его в том, чтобы указать, что поток находится в правильном состоянии и может быть использован дальше.

Кроме того, делает >> извлечение одного или нескольких символов?

В зависимости от типа объекта, который вы прочитали. Для чисел он в основном извлекает столько символов, сколько может. Вы можете прочитать правила подробно here.

0

Оператор >> в stringstream наследуется от IStream. Документация istream говорит, что возвращаемое значение istream object [1]. Я сделал быстрый тест, а возвращаемое значение - void * (возможно, объект stream). Я также вижу, когда поток исчерпан (в конце) возвращаемое значение равно NULL (это из моего теста, и я не мог найти его в документе). Таким образом, это, возможно, объясняет поведение цикла while, поскольку void * и NULL могут быть преобразованы в bool. Просто измените цикл на while (void * x = (ss >> i)) {}, и вы можете получить возвращаемое значение самостоятельно.

Ответ на второй вопрос находится в ссылке ниже, которая гласит: «Извлекает и анализирует символы последовательно из потока, чтобы интерпретировать их как представление значения правильного типа, которое хранится как значение val». Таким образом, в этом случае он будет извлекать столько символов, чтобы преобразовать его в целое число.

[1] http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/

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