std::stringstream.str() 输出垃圾

std::stringstream.str() outputs garbage

本文关键字:输出 stringstream str std      更新时间:2023-10-16

我需要保存一堆带有编号索引的图像文件。我正在尝试使用字符串流构造这些文件名。但是,stringstream.str() 似乎没有返回文件名,而是返回一些垃圾。

这是代码:

std::stringstream filename;
filename << filepath << fileindex << ".png";
bool ret = imwrite(filename.str(),frame, compression_params);
fileindex++;
printf("Wrote %sn", filename.str());

下面是一次执行的输出:

Wrote ╠±0
Wrote ╠±0
Wrote ╠±0
Wrote ╠±0

下面是另一个执行的输出:

Wrote ░‗V
Wrote ░‗V
Wrote ░‗V
Wrote ░‗V

有什么建议吗?是 imwrite 是一个 opencv 函数,我有 [代码]使用命名空间 cv;[/code] 在文件顶部 - OpenCV 和 STD 之间是否存在一些干扰?

您不能将 std::string 这样的非 POD 类型传递给 C 风格的可变参数函数(如 printf )。

您可以使用C++输出:

std::cout << "Wrote " << filename.str() << 'n';

或者,如果你喜欢老派的怪异,提取 C 风格的字符串作为 C 风格的输出:

printf("Write %sn", filename.str().c_str());

filename.str() 返回一个std::string对象。你不能直接printf它。格式%s需要 C 样式字符串。这应该有效

printf("Wrote %sn", filename.str().c_str());

在任何情况下,将 C 样式函数与C++对象一起使用并不总是最好的主意。

您可以使用一些帮助程序函数打印f std::stringstream对象:-

#include <sstream>
#include <stdio.h>
template<typename T>
auto hp(T const & t){
    return t;
}
auto hp(std::string const & ss){
    return ss.c_str();
}
auto hp(std::ostringstream & ss){
    return ss.str();
}
template<typename ... Args>
void printer2(Args const&...args){
    printf(hp(args)...);
}
template<typename ... Args>
void printer(Args&&...args){
    printer2(hp(args)...);
}
int main() {
    std::ostringstream ss;
    ss << "One";
    std::string str {"Two"};
    printer("%s %s %s %c %d", ss, str, "Three", 'n', 7);
}

https://godbolt.org/z/rzvz76neE