2015-03-04 3 views
0

Я пытаюсь использовать stringstream с peek() и get (n). Он работает только для первого значения, Name, а затем дает пустые значения для всего, кроме веса, который дает 0 (при печати с помощью cout).Использование stringstream: только для первого значения

stringstream ss; 
    ss.str("John Smith, Toyota, 160, brown blue, orange"); 
    //Extract into these variables: 
    string Name = "" ; 
    string car = "" ; 
    int weight = 0; 
    string hairColor = ""; 
    string eyeColor = ""; 
    string favoriteColor = ""; 





while (ss.peek() != ',') 
     { 
      char temp; 
      ss. get(temp); 
      Name += temp; 
     } 
while (ss.peek() != ',') 
     { 
      char temp; 
      ss. get(temp); 
      car += temp; 
     } 
while (ss.peek() != ',') 
     { 
      char temp; 
      ss. get(temp); 
      weight += temp; 
     } 
while (ss.peek() != ',') 
     { 
      char temp; 
      ss. get(temp); 
      hairColor += temp; 
     } 
while (ss.peek() != ',') 
     { 
      char temp; 
      ss. get(temp); 
      eyeColor += temp; 
     } 
while (ss.peek() != ',') 
     { 
      char temp; 
      ss. get(temp); 
      favoriteColor += temp; 
     } 


cout << "Name is: " << Name << endl; 
cout << "car is: " << car << endl; 
cout << "weight is: " << weight << endl; 
cout << "Hair color is: " << hairColor << endl; 
cout << "Eye color is: " << eyeColor << endl; 
cout << "Favorite color is: " << favoriteColor << endl; 

В чем проблема?

+1

'ss.peek() == '' 'становится верным в конце первого цикла. – 0x499602D2

+0

, так что мне нужно сбросить его на false? как это сделать? – JCoder

+1

Простое решение состоит в том, чтобы поместить 'ss.ignore()' после замыкающей скобки каждого цикла. – 0x499602D2

ответ

0

ss.peek() == ',' становится истинным в конце первого цикла. Используйте std::getline, так что вы не будете иметь эту проблему:

if (getline(ss, Name) && getline(ss, car) && ss >> weight && getline((ss >> std::ws).ignore(), hairColor)) 
{ 
    cout << "Name is: " << Name << endl; 
    cout << "car is: " << car << endl; 
    cout << "weight is: " << weight << endl; 
    cout << "Hair color is: " << hairColor << endl; 
    cout << "Eye color is: " << eyeColor << endl; 
    cout << "Favorite color is: " << favoriteColor << endl; 
} 
1

Ближайшей задачей является то, что после первого цикла условие продолжения является false, поэтому ни одна из следующих петель, с тем же условием продолжения, не делать ничего.

Однако обычным способом извлечения элемента является использование функции getline, где вы можете указать произвольный символ разделителя вместо новой строки.

Делать это правильно немного вовлечен:

#include <iomanip>    // std::setw 
#include <iostream> 
#include <stdexcept>   // std::runtime_error, std::exception 
#include <stdlib.h>    // EXIT_FAILURE, EXIT_SUCCESS 
#include <sstream>    // std::istringstream 
using namespace std; 

auto fail(const string& s) -> bool { throw runtime_error(s); } 

auto get_string(istream& stream, const char delimiter = ',') 
    -> string 
{ 
    while(stream.peek() == ' ') 
    { 
     stream.get(); 
    } 
    string result; 
    getline(stream, result, delimiter) 
     || fail("get_string: failed to extract text"); 
    return result; 
} 

template< class Type > 
auto get(istream& stream, const char delimiter = ',') 
    -> Type 
{ 
    istringstream conversion_stream(get_string(stream, delimiter)); 
    Type result; 
    conversion_stream >> result 
     || fail("get: failed to convert text to value"); 
    return result; 
} 

template<> 
auto get<string>(istream& stream, const char delimiter) 
    -> string 
{ return get_string(stream, delimiter); } 

template< class Type > 
void display(const char name[], const Type& value) 
{ 
    cout << setw(15) << name << " = " << value << endl; 
} 

#define DISPLAY(x) display(#x, x) 
void cpp_main() 
{ 
    istringstream data_stream("John Smith, Toyota, 160, brown, blue, orange"); 

    const auto name    = get<string>(data_stream); 
    const auto car    = get<string>(data_stream); 
    const auto weight   = get<int>(data_stream); 
    const auto hairColor  = get<string>(data_stream); 
    const auto eyeColor   = get<string>(data_stream); 
    const auto favoriteColor = get<string>(data_stream); 

    DISPLAY(name); 
    DISPLAY(car); 
    DISPLAY(weight); 
    DISPLAY(hairColor); 
    DISPLAY(eyeColor); 
    DISPLAY(favoriteColor); 
} 

auto main() -> int 
{ 
    try 
    { 
     cpp_main(); 
     return EXIT_SUCCESS; 
    } 
    catch(const exception& x) 
    { 
     cerr << "!" << x.what() << endl; 
    } 
    return EXIT_FAILURE; 
}