Как напечатать весь istream в стандартный формат и строку - PullRequest
18 голосов
/ 24 марта 2009

Как вы печатаете переменную istream для стандартного вывода. [EDIT] Я пытаюсь отладить сценарий, в котором мне нужно вывести istream в файл журнала

Ответы [ 5 ]

21 голосов
/ 24 марта 2009

Вы выводите поток потоков istream.

Например, для вывода ifstream на cout:

std::ifstream f("whatever");
std::cout << f.rdbuf();
11 голосов
/ 24 марта 2009

Редактировать: Я предполагаю, что вы хотите скопировать все содержимое потока, а не только одно значение. Если вы хотите прочитать только одно слово, проверьте ответ 1800.


Очевидное решение - циклическое копирование слова за раз, но вы можете сделать это проще, как хороший вкладчик:

#include <iostream>
#include <iterator>

...

std::istream i;
std::copy(std::istream_iterator<char>(i), std::istream_iterator<char>(), std::ostream_iterator<char>(std::cout));

Stream_iterators внутренне используют операторы << и >>, что означает, что они будут игнорировать пробелы. Если вам нужна точная копия, вы можете вместо этого использовать std :: istreambuf_iterator и std :: ostreambuf_iterator. Они работают с базовыми (неформатированными) потоковыми буферами, поэтому не пропускают пробелы, не переводят символы новой строки или что-либо еще.

Вы также можете использовать:

 i >> std::noskipws;

для предотвращения исчезновения пробелов. Однако обратите внимание, что если ваш поток представляет собой двоичный файл, некоторые другие символы могут быть закрыты операторами >> и <<.

5 голосов
/ 24 марта 2009

Будет напечатан весь поток, по 1 символу за раз:

char c;
c = my_istream.get();
while (my_istream)
{
    std::cout << c;
    c = my_istream.get();
}

Это напечатает все, но отбросит пробел:

std::string output;
while(my_istream >> output)
    std::cout << output;
0 голосов
/ 28 мая 2016

перегрузка std :: ifsream и std :: ostringstream

с ++ 11 или выше


Обратите внимание на && в std :: ifstream , которые позволяют направлять, используя

#include <iostream>
#include <sstream>
#include <fstream>

std::ostream& operator<<(std::ostream& os, std::basic_ostringstream&& iss){
    return os<<iss.str();
}

std::ostream& operator<<(std::ostream& os, std::ifstream&& ifs){
    return std::cout<<ifs.rdbuf();
}


int main()
{
    std::cout<<std::ostringstream("Test ostringstream overloading")<<std::endl;
    std::ofstream("fstream.txt")<<"Test fstream overloading"<<std::endl;
    std::cout<<std::ifstream("fstream.txt")<<std::endl; // overloading okay
}

выход:

Test ostringstream overloading
Test fstream overloading


Process returned 0 (0x0)   execution time : 0.012 s
Press ENTER to continue.
0 голосов
/ 24 марта 2009

Вам нужно прочитать с него, а затем вывести то, что вы прочитали:

istream stm;
string str;
stm >> str;
cout << str;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...