从std::basic_istream
中提取特定数量的字符并将其存储在std::string
中,有什么好的,安全的方法?
在以下程序中,我使用char[]
最终获得result
,但我想避免使用POD类型并确保更安全,更易于维护:
#include <sstream>
#include <string>
#include <iostream>
#include <exception>
int main()
{
std::stringstream inss{std::string{R"(some/path/to/a/file/is/stored/in/50/chars Other data starts here.)"}};
char arr[50]{};
if (!inss.read(arr,50))
throw std::runtime_error("Could not read enough characters.\n");
//std::string result{arr}; // Will probably copy past the end of arr
std::string result{arr,arr+50};
std::cout << "Path is: " << result << '\n';
std::cout << "stringstream still has: " << inss.str() << '\n';
return 0;
}
备选方案:
std::string{inss.c_str()}
char[]
std::basic_istream::get
与std::basic_string::push_back
一起阅读所需的字符数
答案 0 :(得分:2)
只需将其直接读入result
字符串即可。
#include <sstream>
#include <string>
#include <iostream>
#include <exception>
int main()
{
std::stringstream inss{std::string{R"(some/path/to/a/file/is/stored/in/50/chars Other data starts here.)"}};
std::string result(50, '\0');
if (!inss.read(&result[0], result.size()))
throw std::runtime_error("Could not read enough characters.\n");
std::cout << "Path is: " << result << '\n';
std::cout << "stringstream still has: " << inss.str() << '\n';
return 0;
}
从C ++ 11开始,以下保证了std::string
(from cppreference)的内存布局。
basic_string
的元素是连续存储的,即basic_string s
,&*(s.begin() + n) == &*s.begin() + n
n
中的[0, s.size())
,或等效地存储的元素指向s[0]
的指针可以传递给期望指向CharT[]
数组的第一个元素的指针的函数。 (自C ++ 11起)