将字符串或 char* 放入 istream 的最佳方法?
Posted
技术标签:
【中文标题】将字符串或 char* 放入 istream 的最佳方法?【英文标题】:Optimal way to get a string or char* into an istream? 【发布时间】:2010-10-04 16:54:11 【问题描述】:将字符串或 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)
【问题讨论】:
对不起;你在这里问什么并不完全清楚。您希望能够像访问流一样访问字符串吗?你想完成什么? 现在编辑了问题。 我应该注意到您的代码无效。您不能从 istringstream 构造 istream。你认为它应该做什么(注意,流不能被复制)。 编辑了我的用例,如果我想使用 istringstream 到 istream,我想我可以使用 up_cast 【参考方案1】:如果你想从中构造一个 istringstream,一个 char* 直到空字符,或者来自 std::string 的所有东西:
istringstream str(ptr); // char*
istringstream str(other_str); // std::string
如果你说想要一个指向 istream 缓冲区的原始指针,你就做不到。如果流从文件、终端或其他方面需要它们,则可以按需获取它们的数据,可选择缓冲它们的东西(嗯,不完全正确。您可以使用strstream
,它接受原始指针并直接从中读取/写入. 但这是一个已弃用的类 - 不要使用它。我很幸运我从未这样做过)。如果你想要的只是你可以使用有点像指针的东西,你可以使用 streambuf 迭代器。不过它们并不是真正的指针,所以你不能从begin
和其他东西中减去end
:
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());
从 str 指向的字节中准确写入 N 个字符。您也可以使用<<
将其写入流中。它会将所有内容写入空字符或 std::string 中的所有内容,但会尊重格式标志,例如字段宽度:
stream << ptr; // char*
stream << other_str; // everything from std::string
【讨论】:
【参考方案2】:这将起作用:
std::istringstream is("abc...");
而且由于 istringstream 是 istream,您将能够将您的 is 对象用作 istream。
【讨论】:
这似乎是显而易见的答案 - 还是 OP 真的在问别的问题? 我也在找这个,不知道会这么容易。如果您不了解流,则流很难:) 这不会复制字符串,直到 C++20?如果是这样,这取决于提问者所说的“最佳”是什么意思。以上是关于将字符串或 char* 放入 istream 的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章