Оптимальный способ получить строку или символ * в istream? - PullRequest
20 голосов
/ 31 января 2009

Какой самый оптимальный способ получить указатель на строку или символ * в istream.

Я хочу сделать следующее

std::string a = "abc..";

//I know this can be done, not sure if this is most efficient
// and not sure about char*    pointers
std::istringstream istr (a);
...
foo (istr); 


void foo(std::istream& is) {

}

Ответы [ 2 ]

18 голосов
/ 31 января 2009

Если вы хотите создать из него поток istring, символ * с нулевым символом или все элементы из std :: string:

istringstream str(ptr); // char*
istringstream str(other_str); // std::string

Если вы говорите о желании получить необработанный указатель в буфер istream, вы не сможете этого сделать. Потоки получают свои данные по требованию, если они им нужны, либо из файлов, терминалов или еще, по желанию буферизуя их содержимое (ну, не совсем верно. Вы можете использовать strstream, который принимает необработанный указатель и читает / пишет непосредственно из этого Но это устаревший класс - не используйте его. Мне повезло, я никогда этого не делал). Если все, что вам нужно, это то, что вы можете использовать как указатель, вы можете использовать итераторы streambuf. Хотя они на самом деле не являются указателями, поэтому вы не можете вычесть end из begin и другие материалы:

std::istreambuf_iterator<char> begin(one_istream), end;
while(begin != end)
    std::cout << *begin++;

Если вы говорите о получении строки из того, что было записано в поток строк, вы можете использовать ostringstream::str:

ostringstream o;
o << "This is a number: " << 42;
std::string str = o.str(); // str == "This is a number: 42"

В противном случае, вы можете читать только материал из istream. Вам нужно ostream, тогда вы можете сделать

stream.write(ptr, N);
stream.write(ptr.c_str(), ptr.c_str() + ptr.size());

для записи ровно N символов из байтов, на которые указывает str. Вы также можете записать его в поток, используя <<. Он будет записывать все до нулевого символа или все из std :: string, но будет учитывать флаги форматирования, такие как ширина поля:

stream << ptr; // char*
stream << other_str; // everything from std::string
15 голосов
/ 31 января 2009

Это будет работать:

 std::istringstream is("abc...");

И поскольку istringstream является istream, вы сможете использовать свой is-объект в качестве istream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...