c++延迟printf直到需要为止
c++ delay printf until needed
在c++中,是否可以用printf(或类似的)写入某种缓冲区,然后在程序的稍后将缓冲区写入屏幕或根据结果丢弃它。
我之所以想这样做,是因为我有一个递归函数,并且只想在递归过程中看到打印的内容,如果结果感兴趣的话。
std::ostringstream
类就是您要查找的。
在C++中,格式化的IO(最好)是通过<iostream>
库完成的。这就是著名的cout << variable << endl
。
CCD_ 4直接输出到标准输出。如果您想缓冲,您可以将输出重定向到std::ostringstream
实例,稍后可以将其重定向到标准输出:
#include <iostream>
[...]
ostringstream buf;
buf << myVar1 << "MyStr" << endl;
[...] // some time later
cout << buf.str();
如果你喜欢printf
的做事方式,你可以使用sprintf
(尽管我不推荐)。它有点复杂,因为你需要提前知道缓冲区的大小。
char myBuf[10000]; // up to you do to the proper bound checking
sprintf(myBuf, "format %d", myvar);
[...] // you may want to use strcat and such for more complex operations
printf(myBuf);
当然。为此,您可以利用vsnprintf
的强大功能。我建议用某种类包装std::string
或std::vector<char>
(在C++11中基本相同):
#include <cstdargs>
#include <cstdio>
#include <string>
class Formatter
{
std::string buf;
public:
void add(char const * fmt, ...)
{
std::va_list ap, aq;
va_start(ap, fmt);
va_copy(aq, ap);
int ret1 = std::vsnprintf(NULL, 0, fmt, ap);
// check ret1 != -1
std::size_t cur = buf.size();
buf.resize(cur + ret1 + 1);
int ret2 = std::vsnprintf(&buf[cur], ret1 + 1, fmt, aq);
// check ret2 != -1
buf.resize(cur + ret1);
va_end(aq);
va_end(ap);
}
std::string const & str() const { return buf; }
};
现在你可以说:
Formatter f;
f.add("Hello, %s", "world");
f.add("%i%i%i", 1, 2, 3);
std::cout << f.str() << std::endl;
如果您非常关心性能,可以尝试为打印操作预先分配一些空间,并保持一个单独的"结束"位置,希望您永远不必多次运行vnsprintf
调用。
使用字符串是什么?或者字符串数组。还是收藏?收集你需要的所有数据并在需要时打印?
您可以使用sprintf
函数,该函数对字符缓冲区执行与printf
相同的操作。但你不能。这些旧的C风格函数在C++中已经过时了,您应该使用流。看起来std::stringstream
适合您的需求。
对于递归函数,最好的方法是延迟获得结果,而不是打印结果,因此:
int fact( int n )
{
printf("%d", n);
if( n!=1 )
return n * fact(n - 1);
else return 1;
};
<....>
fact( 5 );
你可以使用这个:
int fact( int n )
{
if( n!=1 )
return n * fact(n - 1);
else return 1;
};
<....>
int result = fact( 5 );
printf("%d", result);
基本上,只有在准备好后才能打印。如果由于某些原因无法直接执行,请将结果保存到某种缓冲区变量中,并在函数结束后访问它。
- 如何仅为一个函数添加延迟
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 内联程序集printf将整数解释为地址
- 为什么mpfr_printf与十六进制浮点(%a转换说明符)的printf不同
- 以在Qt中的IF语句中设置时间延迟
- 模板化类中静态成员的延迟初始化
- 在 Windows 8/10 技术中完全实时的屏幕捕获,没有延迟
- 将自定义函数传递到基抽象类中以延迟执行
- C++ Setter/Getter,cout 工作,printf 失败
- 我希望改进或要求我目前的延迟/睡眠方法。C++
- 如何在 c++ 中延迟?
- Printf 命令不打印时添加了查找常见除数的新代码
- SIGSEGV, 分段错误. 而 printf() 数组索引的值
- 为什么在包含iostream时可以使用printf()?
- 如何测量管道延迟?
- 获取毫秒延迟的错误值
- C++异常被捕获延迟,可能导致这种情况的原因是什么?
- 我的子类的属性是延迟初始化的
- 创建具有验证和语法突出显示的自定义 printf
- c++延迟printf直到需要为止