我有一些C++代码,它需要在解析某个文件头失败时生成错误消息。在这种情况下,我需要确保报头中的某个4字节字段为"OggS",如果不是,则返回错误消息,如"invalid capture_pattern:'FooB';expecting 'OggS'“。我的代码看起来像这样:
const string OggPage::parseHeader(void) {
read(fd, capture_pattern, sizeof(capture_pattern)); // error handling omitted
if (strncmp(capture_pattern, CAPTURE_PATTERN, sizeof(capture_pattern)) != 0) {
char err[256];
snprintf(err, sizeof(err), "Failed to read %d bytes from file descriptor %d: %s\n", sizeof(capture_pattern), fd, err);
return err;
}
return "Everything was A-OK!";
}从其他数据类型构建字符串的标准C++习惯用法是什么?我并不执着于这里的printf(3)-style格式,所以请随意提出任何可行的建议。
发布于 2011-05-01 17:03:25
您可以使用C++标准库中的stringstream或ostringstream。如果进一步的流不会被用来从其中读取值(例如,不会使用它的istream部分),ostringstream更合适。
#include <sstream>
#include <string>
#include <iostream>
int main() {
std::stringstream str_stream;
int number = 5;
str_stream << " String with number " << number << std::endl;;
std::string str = str_stream.str();
std::cout << str;
}发布于 2011-05-01 17:03:22
实现这一点的C++方法是std::stringstream。
std::stringstream err;
err << "Failed to read " << sizeof(capture_pattern)
<< " bytes from fd " << fd << std::endl;
return err.str();发布于 2011-05-01 17:03:35
从cstring中使用字符串函数对于阅读来说无疑是很好的。它们快速、方便,而且不冗长。
为了构建您的错误消息,您可以使用stringstream、与string类相关的运算符、boost::format或您所说的snprintf。
您还可以使用boost::lexical_cast来处理简单的事情:
string message = "Failed to read " + lexical_cast<string>(n) +
" bytes from the descriptor " + lexical_cast<string>(fd) + ".";我建议从理智的角度看一看this Gotw。
如果你有很多格式化工作要做,我推荐你使用boost::format。对于简单的孤立事物使用lexical_cast,如果您有需要,请使用stringstream (例如,自定义operator<<,不能使用boost等)。
老实说,snprintf真的很好。
https://stackoverflow.com/questions/5847480
复制相似问题