Подтвердить что ты не робот

Оптимальный способ получить строку или char * в istream?

Какой оптимальный способ получить строку или указатель char * в 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) {

}
4b9b3361

Ответ 1

Если вы хотите построить из него istringstream, char * до нулевого символа или все материалы из 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

Ответ 2

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

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

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