如何将文件读入std :: string,即一次读取整个文件?
文本或二进制模式应由调用者指定.该解决方案应符合标准,便携且高效.它不应该不必要地复制字符串的数据,它应该避免在读取字符串时重新分配内存.
一种方法是statize文件大小,将std :: string和fread()的大小调整为std :: string的const_cast< char *>()’ed data().这要求std :: string的数据是连续的,这是标准不需要的,但似乎是所有已知实现的情况.更糟糕的是,如果在文本模式下读取文件,则std :: string的大小可能与文件大小不同.
可以使用std :: ifstream的rdbuf()将std :: ostringstream构建为完全正确,符合标准且可移植的解决方案,并从那里构建为std :: string.但是,这可能会复制字符串数据和/或不必要地重新分配内存.所有相关的标准库实现是否足够智能以避免所有不必要的开销?还有另一种方法吗?我是否错过了一些已经提供所需功能的隐藏Boost功能?
请显示您的建议如何实施.
void slurp(std::string& data, bool is_binary)
考虑到上面的讨论.
解决方法:
并且最快(我知道,折扣内存映射文件):
std::string str(static_cast<std::stringstream const&>(std::stringstream() << in.rdbuf()).str());
这需要额外的标题< sstream>对于字符串流.
(static_cast是必要的,因为operator<<返回一个普通的老ostream& ;;但我们知道实际上它是一个字符串流&所以演员是安全的.)
拆分成多行,将临时值移动到变量中,我们得到一个更易读的代码:
std::string slurp(std::ifstream& in) {
std::stringstream sstr;
sstr << in.rdbuf();
return sstr.str();
}
或者,再次在一行中:
std::string slurp(std::ifstream& in) {
return static_cast<std::stringstream const&>(std::stringstream() << in.rdbuf()).str();
}
标签:c,string,file-io 来源: https://codeday.me/bug/20190911/1803165.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。