如何在Linux gcc下确定vswprintf的缓冲区大小

时间:2010-11-05 16:34:11

标签: c++ gcc unicode

我需要为格式函数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一起

3 个答案:

答案 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);