我需要为格式函数vswprintf()分配足够的缓冲区。当使用ANSI字符串做同样的事情时,我正在使用:
vsnprintf( NULL, NULL, pszFormat, args );
返回所需的缓冲区大小。但似乎这个函数的unicode版本没有这个功能。当我执行:
vswprintf( NULL, NULL, pszFormat, args );
结果值始终为-1。
我发现只有解决方案是使用大型静态缓冲区来计算所需的大小。但我不喜欢这个解决方案:
static const int nBuffSize = 1024;
static XCHAR evalBuff[nBuffSize];
int nSize = vswprintf( evalBuff, nBuffSize, pszFormat, args );
if ( nSize != -1 )
{
return nSize;
}
else
{
throw XXX;
}
有没有办法测量unicode字符串所需的缓冲区大小?
此致 Ludek一起
答案 0 :(得分:5)
打开一个虚拟文件到/ dev / null(或Windows下的NUL)并打印到该文件以检索大小非常有效(它比打印到字符串更快):
#if!defined(_MSC_VER)
printf_dummy_file = fopen(“/ dev / null”,“wb”);
#else
printf_dummy_file = fopen(“NUL”,“wb”);
#ENDIF
...
n = vfprintf(printf_dummy_file,format,args);
“fopen”部分应该完成一次(如果使用C ++,可以使用静态变量或全局变量的构造函数。)
答案 1 :(得分:1)
有点重量级,但如果没有人提出更好的东西,你可以指数增长一个缓冲区,直到它足够大:
std::vector<wchar_t> vec(512);
int nSize;
do {
vec.resize(vec.size()*2);
va_list args2;
va_copy args2, args;
nSize = vswprintf(&vec[0], vec.size(), format, args2);
va_end args2
} while(nSize < 0);
// now I have the length, and the formatted string to copy if required.
由于您使用的是POSIX,因此您认为会因为缓冲区空间不足而定义错误,并且应该在while
条件下检查此错误,以便其他错误不会导致错误资源匮乏的循环。但是在http://opengroup.org/onlinepubs/007908775/xsh/fwprintf.html没有定义这样的错误,所以我猜你必须测试你实际上对你的实现有什么错误(如果有的话)。
另一个选择是删除格式字符串,而是写入wostringstream
。但是,如果需要在编译时配置格式字符串,则没有多大用处。
答案 2 :(得分:-1)
这将获得缓冲区大小:
vswprintf(nullptr,-1,pszFormat,args);