2012-03-02 5 views
0

Я хочу знать, сколько строк есть в моей переменной, когда я использую istringstream:Найти сколько строк в istringstream

string cadena; 
int num; 

istringstream ss(cadena); 
ss >> num; 
int n = ss.size(); // This doesn't work 

Например, если cadena является: "1 2 3 4", когда я использую istringstream Я хочу знать, как много строк находятся в ss (в данном случае 4).

+0

Ну, 'stringstream' не' VECTOR' ... –

+1

какие символы вы считаете завершением строки, только пробелы? – perreal

+0

Я использую istringstream, потому что не хочу подсчитывать пробелы между числами. – EricJ

ответ

2

Единственный способ, о котором я знаю, - разобрать строки, чтобы увидеть. std::distance с istream_iterator может сделать это для вас:

std::distance(std::istream_iterator<string>(ss), 
       std::istream_iterator<string>()); 
+0

После этого, конечно, он читает поток и должен его снова создать, чтобы перечитать его. –

+0

@JamesKanze: Yup - хотя, конечно, это довольно легко сделать со строкой. Очевидной альтернативой было бы считывание данных в вектор, а затем поиск размера вектора. –

1
#include <iostream> 
#include <sstream> 
#include <algorithm> 
#include <ctype.h> 

int main() 
{ 
    std::string str = ss.str(); 

    // int c = (int) std::count_if (str.begin(), str.end(), isspace) + 1; 
    int c = 1; // 0 
    for (unsigned int i = 0; i <str.size(); i++) 
    if (isspace(str[i])) 
     c++; 
    std::cout << c; 
    return 1; 
} 
+0

Это не сработало, компилятор не знает count_if – EricJ

+0

Это потому, что это имя 'std :: count_if'. –

+0

Но, конечно, это ничего не говорит о том, сколько полей может быть. –

0

Вы можете сделать что-то подобное, добавьте в то время как петля

while(ss>>cadena) {

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