如何将输出从 ostream_iterator 转换为字符串?
How can I convert the output from a ostream_iterator to a string?
我主要使用 ostream_iterator 在 C++ 中实现 toString 方法。
std::ostream_iterator<int> output(std::cout, " ");
打印到控制台后,但是,我希望return 将ostream_iterator 的输出作为字符串。这种直接转换可行吗?
Is this direct conversion possible?
我认为,不,因为 ostream_iterator
用于以一种方式将数据发送到流,所以如果目标是 std::cout
,则不能使用 ostream_iterator
取回数据。
但您可以使用其他目的地,例如ostringstream
对象,然后通过 cout
将其用于两个输出,并根据需要再次使用。
考虑一个简单的例子:
std::stringstream buff;
std::ostream_iterator<int> output(buff, " ");
std::istringstream str("10 3 ABC 7 1");
// just copy only first integer values from str (stop on the first non-integer)
std::copy(std::istream_iterator<int>(str), std::istream_iterator<int>(), output);
// output as a string to std output
std::cout << buff.str() << std::endl;
// do something else
buff.seekp(0, std::ios::end);
std::cout << "String size is " << buff.tellp() << std::endl;
如果你想要一个使用 std::ostream
接口而不是 STL 容器接口的类字符串对象,那就是 std::stringstream
,或者已弃用的 std::strstream
最接近泛型的东西将任何可以用 cout <<
序列化为 std::string
的包装器将写入 std::stringstream
然后读回数据。然而,这最终将至少制作一份昂贵的副本。这是一个实现:
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
using std::cout;
using std::endl;
using isit = std::istream_iterator<char>;
template <typename T> std::string to_string(const T& x)
// Must be able to print a T with std::ostream::operator<<.
{
std::stringstream buffer;
buffer << x;
const isit begin(buffer); // The start of the stream object.
static const isit end; // Default object is the end-of-stream iterator.
return std::string( begin, end );
}
int main(void)
{
const std::string output_string = to_string("Testing:") + " " +
to_string(1) + ", " + to_string(2ULL) + ", " + to_string(3.0) +
to_string('.');
cout << output_string << endl;
return EXIT_SUCCESS;
}
您可以使用 std::ostream_iterator<char>
写入 std::stringstream
,而不是 <<
,然后使用 std::istream_iterator<char>
将其复制到字符串。
您可以使用 std::istream_iterator
将数据从 std::istream
写入 std::string
。有点。格式可能不稳定。
如果要使用迭代器从std::string
中读取数据,其迭代器类型为std::string::iterator
,字符串前面的迭代器为s.begin()
,与其他STL一样集装箱。
如果您只是将一堆数据存储在内存中并希望发送到输出迭代器和字符串,则可以使用它的其他构造函数之一。
是的,只需将 cout 替换为 stringstream,您就可以从中创建字符串。
std::stringstream ss; // #include <sstream>
std::ostream_iterator<int> output(ss, " ");
std::string s(ss.str());
我主要使用 ostream_iterator 在 C++ 中实现 toString 方法。
std::ostream_iterator<int> output(std::cout, " ");
打印到控制台后,但是,我希望return 将ostream_iterator 的输出作为字符串。这种直接转换可行吗?
Is this direct conversion possible?
我认为,不,因为 ostream_iterator
用于以一种方式将数据发送到流,所以如果目标是 std::cout
,则不能使用 ostream_iterator
取回数据。
但您可以使用其他目的地,例如ostringstream
对象,然后通过 cout
将其用于两个输出,并根据需要再次使用。
考虑一个简单的例子:
std::stringstream buff;
std::ostream_iterator<int> output(buff, " ");
std::istringstream str("10 3 ABC 7 1");
// just copy only first integer values from str (stop on the first non-integer)
std::copy(std::istream_iterator<int>(str), std::istream_iterator<int>(), output);
// output as a string to std output
std::cout << buff.str() << std::endl;
// do something else
buff.seekp(0, std::ios::end);
std::cout << "String size is " << buff.tellp() << std::endl;
如果你想要一个使用 std::ostream
接口而不是 STL 容器接口的类字符串对象,那就是 std::stringstream
,或者已弃用的 std::strstream
最接近泛型的东西将任何可以用 cout <<
序列化为 std::string
的包装器将写入 std::stringstream
然后读回数据。然而,这最终将至少制作一份昂贵的副本。这是一个实现:
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
using std::cout;
using std::endl;
using isit = std::istream_iterator<char>;
template <typename T> std::string to_string(const T& x)
// Must be able to print a T with std::ostream::operator<<.
{
std::stringstream buffer;
buffer << x;
const isit begin(buffer); // The start of the stream object.
static const isit end; // Default object is the end-of-stream iterator.
return std::string( begin, end );
}
int main(void)
{
const std::string output_string = to_string("Testing:") + " " +
to_string(1) + ", " + to_string(2ULL) + ", " + to_string(3.0) +
to_string('.');
cout << output_string << endl;
return EXIT_SUCCESS;
}
您可以使用 std::ostream_iterator<char>
写入 std::stringstream
,而不是 <<
,然后使用 std::istream_iterator<char>
将其复制到字符串。
您可以使用 std::istream_iterator
将数据从 std::istream
写入 std::string
。有点。格式可能不稳定。
如果要使用迭代器从std::string
中读取数据,其迭代器类型为std::string::iterator
,字符串前面的迭代器为s.begin()
,与其他STL一样集装箱。
如果您只是将一堆数据存储在内存中并希望发送到输出迭代器和字符串,则可以使用它的其他构造函数之一。
是的,只需将 cout 替换为 stringstream,您就可以从中创建字符串。
std::stringstream ss; // #include <sstream>
std::ostream_iterator<int> output(ss, " ");
std::string s(ss.str());