Ответ 1
Вы выходите из потокового потока istream.
Например, для вывода ifstream в cout:
std::ifstream f("whatever");
std::cout << f.rdbuf();
Как вы печатаете переменную istream для стандартного вывода. [EDIT] Я пытаюсь отладить сценарий, в котором мне нужно выпустить istream в файл журнала
Вы выходите из потокового потока istream.
Например, для вывода ifstream в cout:
std::ifstream f("whatever");
std::cout << f.rdbuf();
Изменить: я предполагаю, что вы хотите скопировать все содержимое потока, а не только одно значение. Если вы хотите только прочитать одно слово, вместо этого установите вместо него 1800 ответов.
Очевидное решение - это цикл while, копирующий слово за раз, но вы можете сделать это проще, как приятный oneliner:
#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;
чтобы предотвратить исчезновение пробелов. Однако обратите внимание, что если ваш поток является двоичным файлом, некоторые другие символы могут быть сгруппированы операторами >>
и <<
.
Это будет печатать весь поток, по одному символу за раз:
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;
Вам нужно прочитать его, а затем вывести то, что вы читаете:
istream stm;
string str;
stm >> str;
cout << str;
Обратите внимание на &&
в 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.