2012-07-04 5 views
0
string str; 
stringstream buffer; 

buffer << is.rdbuf(); 

str = buffer.str(); 

cout << str.length(); 
size_t pos = str.find_first_not_of(".123456789"); 

Может кто-нибудь объяснить мне, почему этот код не работает?Получение длины строки после считывания из буфера

Когда я запускаю его, он просто сидит там после того, как я вхожу «12345»

Что на земле происходит ?! Я не слишком хорошо знаком с строками, но почему бы и нет, а другие, казалось бы, мирские операции работают так, как ожидалось?

+0

Вы просто пытаетесь прочесть одно слово или строку? –

+0

Я пытаюсь прочитать все, что входит в стандартный ввод. Причина, по которой я не использую стандартную getline (is, str), заключается в том, что я тоже хочу читать в escape-символах. Но, увы, я сталкиваюсь с этими головными болями, когда занимаюсь потоками. – ordinary

+0

Ввод ввода не завершает ввод. –

ответ

1

Может быть, это то, что вы ищете:

string str; 
getline(is,str); 
cout << str.length(); 
size_t pos = str.find_first_not_of(".123456789"); 
+0

К сожалению, это не будет читаться в escape-последовательностях. – ordinary

+0

@ordinary: под Linux, если я ударил бегство, тогда это станет частью str. Например, если я удаляю escape и затем нажимаю Enter, str содержит один escape-символ. Я не уверен, какую платформу вы используете. –

+0

Какие escape-последовательности? Как буквальный '\', за которым следует буквальный 'n'? Конечно, это тоже будет читать! – CygnusX1

2

Думаю, вам нужно закрыть поток, т. Е. Ctrl + D или что-то еще.
Помните, что для потоков новая строка - это еще один (два) символа.

Таким образом, вам, вероятно, потребуется использовать различный считыватель потока, который может обрабатывать линии. Я не знаю, что такое STD lib, но я уверен, что он есть.

+0

Для текстовых потоков (и все потоки, кроме потоков, открытых в двоичном режиме, являются текстовыми потоками), новая строка - это один символ. –

0

Я не очень понимаю, что вы имеете в виду, не читая управляющие последовательности? getline будет читать все по мере ввода. Рассмотрим следующий пример (немного уродливый, как вы смешиваете C и C++ конструкции):

#include <stdio.h> 
#include <iostream> 

int main() { 
     std::string str; 
     getline(std::cin,str); 
     printf("string length: %ld\n",str.length()); 
     size_t pos = str.find_first_not_of(".123456789"); 
     printf("first nondigit: %ld\n",pos); 
     printf("you typed: %s\n",str.c_str()); 
     return 0; 
} 

Если я запускаю его и введите в

12345\n\t a 

я получаю следующий результат:

string length: 11 
first nondigit: 5 
you typed: 12345\n\t a 
0

cin ждет ввода разделителя. Нажмите Enter, когда вы закончите ввод строки.

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