将字符串或 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 个字符。您也可以使用&lt;&lt; 将其写入流中。它会将所有内容写入空字符或 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 的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 IStream 实例中的数据读入 char 指针?

将 boost`s bufferstream 转换为 istream

字符串相关函数

std::istream::get

尝试将 char 转换为字符串以放入方法中;我哪里错了?

C# char.isupper 在将数字放入字符串索引时抛出错误 [关闭]