Visual c++ 使WCHAR空终止

Visual c++ 使WCHAR空终止,visual-c++,Visual C++,我有这个 WCHAR文件名[1] 作为函数的返回值(它是sys 32函数,因此我无法更改返回的类型)。我需要使文件名以null结尾,所以我尝试将“\0”附加到它,但似乎没有任何效果 一旦我得到一个以null结尾的WCHAR,我需要将它传递给另一个sys32函数,所以我需要它保持为WCHAR 谁能给我一些建议吗 ================================================ 非常感谢你的帮助。看起来我的问题不仅仅是缺少以null结尾的字符串 //这项工作: WCH

我有这个

WCHAR文件名[1]

作为函数的返回值(它是sys 32函数,因此我无法更改返回的类型)。我需要使文件名以null结尾,所以我尝试将“\0”附加到它,但似乎没有任何效果

一旦我得到一个以null结尾的WCHAR,我需要将它传递给另一个sys32函数,所以我需要它保持为WCHAR

谁能给我一些建议吗

================================================

非常感谢你的帮助。看起来我的问题不仅仅是缺少以null结尾的字符串

//这项工作:

WCHAR szPath1[50] = L"\\Invalid2.txt.txt";
    dwResult = FbwfCommitFile(szDrive, pPath1); //Successful
//这并不是:

std::wstring l_fn(L"\\");  
    //Because Cache_detail->fileName is \Invalid2.txt.txt and I need two
l_fn.append(Cache_detail->fileName);
l_fn += L""; //To ensure null terminated
fprintf(output, "l_fn.c_str: %ls\n", l_fn.c_str()); //Prints "\\Invalid2.txt.txt"

    iCommitErr = FbwfCommitFile(L"C:", (WCHAR*)l_fn.c_str()); //Unsuccessful
//那么当我比较这两个的时候,它们是不相等的

int iCompareResult = l_fn.compare(pPath1);  // returns -1
所以我需要弄清楚这两个人最终是如何不同的


非常感谢

由于WCHAR的每个字符大小为16位,您可能应该在其上附加
\0\0
,但我不确定这是否有效。顺便说一下,
WCHAR文件名[1]
正在创建一个长度为1的
WCHAR
,可能您需要类似于
wcharfilename[1024]的东西代替。

WCHAR文件名[1]
是一个由1个字符组成的数组,因此如果以null结尾,它将只包含null终止符
L'\0'

您正在调用哪个API函数

编辑

fbwfcachedeail
中的
fileName
成员仅为1个字符,这是数组长度未知且成员是结构中最后一个成员时使用的常用技术。正如您可能已经注意到的,如果分配的缓冲区只有
sizeof(fbwfcacheddetail)
长,那么FbwfFindFirst返回
错误\u内存不足

因此,如果我理解,您希望做的是使用fprintf输出以非NULL结尾的文件名。这可以按如下方式进行

fprintf (outputfile, L"%.*ls", cacheDetail.fileNameLength, cacheDetail.fileName);
这将只打印
文件名
的第一个
文件名长度
字符

另一种方法是在文件名末尾附加一个空终止符。首先,您需要确保缓冲区足够长,这可以通过从传递给FbwfFindFirst的
size
参数中减去
sizeof(WCHAR)
来完成。因此,如果分配一个1000字节的缓冲区,将把998传递给FbwfFindFirst,将缓冲区中的最后两个字节保留给您自己使用。然后,要添加空终止符并输出文件名,请使用

cacheDetail.fileName[cacheDetail.fileNameLength] = L'\0';
fprintf (outputfile, L"%ls", cacheDetail.fileName);

使用L'\0',而不是'\0'。

因为您在评论中提到了fbwffindfirst/fbwffindnext,所以您指的是在中返回的文件名。因此,从fileNameLength字段可以知道文件名的长度(以字节为单位)。WCHAR中文件名的长度为fileNameLength/sizeof(WCHAR)。因此,简单的答案是,您可以设置

fileName[fileNameLength/sizeof(WCHAR)+1] = L'\0'
现在这是非常重要的您需要确保为cacheDetail参数发送到fbwffindfirst/fbwffindnext的缓冲区的大小(WCHAR)字节比您需要的大,上述代码段可能会在数组的边界之外运行。因此,对于缓冲区size-sizeof(WCHAR)中的fbwffindfirst/fbwffindnext pass的size参数

例如:

// *** Caution: This example has no error checking, nor has it been compiled ***
ULONG error;
ULONG size;
FbwfCacheDetail *cacheDetail;

// Make an intial call to find how big of a buffer we need
size = 0;
error = FbwfFindFirst(volume, NULL, &size);
if (error == ERROR_MORE_DATA) {
    // Allocate more than we need
    cacheDetail = (FbwfCacheDetail*)malloc(size + sizeof(WCHAR));
    // Don't tell this call about the bytes we allocated for the null
    error = FbwfFindFirstFile(volume, cacheDetail, &size);
    cacheDetail->fileName[cacheDetail->fileNameLength/sizeof(WCHAR)+1] = L"\0";

    // ... Use fileName as a null terminated string ...

    // Have to free what we allocate
    free(cacheDetail);
}
当然,您必须进行适当的更改以适应您的代码(此外,您还必须调用fbwffindnext)


如果您对FbwfCacheDetail结构以WCHAR[1]字段结尾的原因感兴趣,请参见以下内容。这是Windows API中非常常见的模式。

谢谢您的建议。你知道我是如何将它添加到WCHAR的吗?我应该提到我对C++非常陌生,所以更多细节:更好的是:欢呼。在这种情况下,如果你发布更多的代码会有帮助,因为你所发布的内容可以被任何方式使用。不,没有必要。wchar是一个2字节字符,这是正确的。但是WCHAR文件名[1]引用了一个2字节的数字,即0。您从哪个函数获取字符串?您确定它没有以NULL结尾吗?WCHAR文件名[1]将只包含1个字符(零结尾字符)。如果您在win32/mfc上,您可能需要WCHAR文件名[MAX_PATH]。实际上我打印出了fprintf(outputfile,%ls\n“,fileName),它包含多个字符。它打印\Mydirectory\Myfile.txt。我使用的是fbwfapi。我正在调用fbwffindfirst/fbwffindnext(它返回一个以非空结尾的WCHAR文件名[1])在我的覆盖中查找文件列表,然后调用fbwfcommitfile(需要以null结尾的宽字符串)来提交文件。知道如何进行追加吗?然后文件名就已经以null结尾了-无论是有意还是无意。根据定义,带有这些参数的fprintf()将完整字符串打印到outputfile中(旁注:注意文件名不能超过outputfile,否则会导致缓冲区溢出)。根据定义,字符串以空字符结尾。如果fprintf没有遇到空字符,那么它将继续打印,直到它超出可访问内存的边缘。也就是说:你真正想要实现的是什么-你想要实现什么结果?我编辑了我的原始帖子,以包含更多信息。现在我明白你的意思了正在尝试。谢谢Stephen。你的帮助让我走得更远。出于某些原因,(L'\0')的附加似乎没有任何作用。你介意看看我的最新帖子吗?谢谢。谢谢。关于如何附加的任何建议?干杯。非常感谢!你的帮助让我走得更远。但是出于某些原因,(L'\0')的附加)好像什么都没做。你介意看看我最近的帖子吗?谢谢。