28

将字符串或 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) {

}
4

2 回答 2

26

如果你想从中构造一个 istringstream,一个 char* 到空字符,或者来自 std::string 的所有东西:

istringstream str(ptr); // char*
istringstream str(other_str); // std::string

如果您谈论想要一个指向 istream 缓冲区的原始指针,您就不能这样做。如果流从文件、终端或其他地方需要它们,则可以按需获取它们的数据,可以选择缓冲它们的东西(嗯,不完全正确。您可以使用 a strstream,它接受原始指针并直接从中读取/写入。但它是一个已弃用的类 - 不要使用它。我很幸运我从未这样做过)。如果你想要的只是你可以使用有点像指针的东西,你可以使用 streambuf 迭代器。它们不是真正的指针,所以你不能减去endbegin其他东西:

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
于 2009-01-31T19:51:13.750 回答
23

这将起作用:

 std::istringstream is("abc...");

由于 istringstream 是 istream,您将能够将您的 is 对象用作 istream。

于 2009-01-31T19:43:56.120 回答