Por*_*ker 1 c++ file-io winapi
我下面这个指南从MSDN上如何列出一个目录中的文件(我使用的是当前目录).在我的情况下,我需要将信息放在我的数据包的消息部分(大小为1016的字符数组)中,以将其发送到客户端.当我在客户端和服务器上打印packet.message时,只显示文件名的第一个字符.怎么了?以下是相关代码段的摘要:
WIN32_FIND_DATA f;
HANDLE h = FindFirstFile(TEXT("./*.*"), &f);
string file;
int size_needed;
do
{
sprintf(packet.message,"%s", &f.cFileName);
//Send packet
} while(FindNextFile(h, &f));
Run Code Online (Sandbox Code Playgroud)
这通常是由于广泛的字符串被错误地视为ASCII字符串引起的.构建目标是UNICODE并cFileName包含一个宽字符串,但sprintf()假设它是一个ASCII字符串.
FindFirstFile()将映射到FindFirstFileA()或者FindFirstFileW()取决于构建是否针对UNICODE.
解决方案是FindFirstFileA()明确使用和ASCII字符串.
请注意,在以下&情况中不需要sprintf():
sprintf(packet.message, "%s", f.cFileName);
Run Code Online (Sandbox Code Playgroud)
由于应用程序正在使用超出其控制范围的字符串(即文件名),我建议使用更安全_snprintf()的避免缓冲区溢出:
/* From your comment on the question 'packet.message' is a 'char[1016]'
so 'sizeof()' will function correctly. */
if (_snprintf(packet.message, sizeof(packet.message), "%s", f.cFileName) > 0)
{
}
Run Code Online (Sandbox Code Playgroud)