首页 / 知识
关于Unix:C ++:如何在没有sprintf的情况下将fprintf结果作为std :: string获得
2023-04-15 18:35:00

C++: how to get fprintf results as a std::string w/o sprintf我正在使用以C ++实现的开源UNIX工具,我需要更改一些代码才能使其执行我想要的操作。我希望进行最小的更改,以期使我的补丁程序被上游接受。首选可在标准C ++中实现且不会创建更多外部依赖项的解决方案。 这是我的问题。我有一个C ++类(我们称它为" A"),该类当前使用fprintf()将其格式化的数据结构打印到文件指针上。在其打印功能中,它还递归调用几个成员类的相同定义的打印功能(" B"为示例)。还有另一个类C,其成员std :: string" foo"需要设置为A实例的print()结果。将其视为A的to_str()成员函数。 用伪代码:
我应该提到C是相当稳定的,但是A和B(以及A的其他受抚养人)处于不断变化的状态,因此所需的代码更改越少越好。当前的print(FILE * F)接口也需要保留。我考虑了几种实现A :: to_str()的方法,每种方法都有其优点和缺点: 将对fprintf()的调用更改为sprintf()
尝试在字符串流中捕获a.print()的结果
使用Boost的字符串格式库
printf(format_str,args)-> cout << boost :: format(format_str)%arg1%arg2%等 使用Qt的QString :: asprintf()
那么,我是否穷尽了所有可能的选择?如果是这样,您认为我的最佳选择是什么?如果没有,我忽略了什么? 谢谢。 这是我喜欢使功能与'sprintf'相同的惯用法,但返回一个std :: string,并且可以避免缓冲区溢出问题。这段代码是我正在编写的一个开源项目(BSD许可证)的一部分,因此每个人都可以随意使用它。
编辑:当我编写此代码时,我不知道这需要C99一致性,并且Windows(以及较旧的glibc)具有不同的vsnprintf行为,在该行为中,失败将返回-1,而不是确定多少空间是必需的。这是我修改后的代码,大家可以看看吗,如果您认为还可以,我将再次编辑以列出唯一的成本:
我正在使用#3:boost字符串格式库-但我必须承认,格式规范的差异从来没有任何问题。 对我而言,它的工作就像一个魅力-外部依赖可能会更糟(一个非常稳定的库) 编辑:添加示例如何使用boost :: format而不是printf:
boost :: format库将是这样的:
希望这有助于阐明boost :: format的用法 我已经在4或5个应用程序中将boost :: format用作sprintf / printf的替代品(将格式化的字符串写入文件,或将自定义输出写入日志文件),并且从未遇到格式差异的问题。可能有一些(或多或少晦涩的)格式说明符有所不同-但我从来没有遇到过问题。 相比之下,我有一些我无法真正使用流的格式规范(据我所记得) 您可以使用std :: string和iostream进行格式化,例如setw()调用以及iomanip中的其他格式 您应该尝试使用Loki库的SafeFormat头文件(http://loki-lib.sourceforge.net/index.php?n=Idioms.Printf)。它与boost的字符串格式库相似,但是保留了printf(...)函数的语法。 我希望这有帮助! 以下是替代解决方案:
(
当然,您应该真正使用snprintf而不是sprintf来避免缓冲区溢出。您也可以有选择地将风险较大的sprintfs更改为<<格式,以确保安全,但更改尽可能少。
{fmt}库提供了
免责声明:我是这个图书馆的作者。
这是有关序列化的吗?还是打印正确? |
最新内容
相关内容
linux命令下载工具?
linux命令下载工具?,工具,网络,代理,代码,简介,位置,系统,第一,下载工具,文件,Linux下多线程下载工具MWget和Axel使用介绍1、wget是linux下一linux命令行执行成功?
linux命令行执行成功?,系统,信息,状态,服务,管理,百度,设计,灵活,代码,命令,Linux系统中如何用shell脚步判断是否telnet成功。1、连接到相应的安卓执行linux命令行?
安卓执行linux命令行?,系统,设备,基础,发展,标准,情况,信息,电话,号码,工具,安卓超级终端可以执行全部linux命令吗?可以,安卓都行,下个终端模拟linux分辨率操作命令?
linux分辨率操作命令?,系统,情况,分辨率,底部,状态,命令,屏幕,屏幕分辨率,桌面,显示器,怎么调整linux的屏幕分辨率?1、Linux系统更改屏幕分辨linux执行中退出命令?
linux执行中退出命令?,档案,状态,命令,分析,数据,电脑,实时,系统,工具,编辑,linux用VI编辑后保存退出命令是什么啊?linux退出vi编辑命令有四种linux定时执行命令?
linux定时执行命令?,时间,系统,服务,任务,工作,标准,情况,周期性,工具,命令,linux下编写定时任务crontablinux怎么添加定时任务?下面就让我们来linux好用的命令工具?
linux好用的命令工具?,系统,管理,工具,基础,服务,信息,工作,发行,公司,代码,Linux系统中进行磁盘管理的常用命令有哪些?分别有什么功能Linux磁linux命令行操作软件?
linux命令行操作软件?,软件,工具,系统,名称,管理,工作,命令,设计,平台,标准,在Linux下有哪些视图或者命令行工具可用1、top 1 vmstat vmstat命linux看命令执行过程?
linux看命令执行过程?,系统,服务,状态,软件,时间,数据,地址,命令,进程,情况,linux查看历史命令记录及时间(linux查看历史命令执行时间)打开linlinux登陆执行命令?
linux登陆执行命令?,系统,服务,工具,地址,密码,百度,管理,检测,网络,第一,怎么在linux启动的时候执行一个命令?1、如果 你装的是centos6 的系linux权限命令可执行?
linux权限命令可执行?,系统,工具,信息,权限,数字,网络,发行,底部,代码,文件,linux修改文件权限?1、打开linux系统,在linux的桌面的空白处右击。linux常用命令行工具?
linux常用命令行工具?,系统,工作,工具,地址,管理,信息,命令,软件,目录,基础,linux常用命令有哪些1、linux系统常用操作命令linux系统常用操作