什麼是從std::basic_istream
中提取特定數量字符並將其存儲在std::string
中的好方法?從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()}
- 這似乎是浪費,因爲它無線ld製作整個流的副本。
- 寫模板函數接受
char[]
- 這仍然使用中間POD陣列。
- 使用
std::basic_istream::get
在循環中讀取所需的字符數與std::basic_string::push_back
- 循環似乎有點笨拙起來,但它避免了陣列。
可能的重複:[如何從字符串流中取出字符而不進行復制?](http://stackoverflow.com/questions/28663075/how-to-get-characters-out -of-stringstream-without-copy) – NathanOliver
你保證文件名是50個字符或更少? –
@QPaysTaxes文件格式具有分配給文件名的前50個字符。所以只要文件格式保持不變,就可以保證。風險在於文件格式發生變化,然後代碼必須更改。 – wally