C++ 无法将文件解压缩到文件夹

C++ 无法将文件解压缩到文件夹,c++,zip,C++,Zip,我正在尝试在指定位置解压.zip文件。用户输入要解压缩的文件名,如“D:\\folder\\sample.zip”。我正在使用此链接中的zip标题和.cpp文件 下面是我的代码 int main() { char filename[100]; HZIP hz; DWORD writ; printf("Enter filename: \n"); gets(filename); TCHAR *name = (TCHAR *) filename; hz

我正在尝试在指定位置解压.zip文件。用户输入要解压缩的文件名,如“D:\\folder\\sample.zip”。我正在使用此链接中的zip标题和.cpp文件

下面是我的代码

int main()
{
    char filename[100];
    HZIP hz; DWORD writ;
    printf("Enter filename: \n");
    gets(filename);
    TCHAR *name = (TCHAR *) filename;
    hz = OpenZip(name,0);
    SetUnzipBaseDir(hz,_T("D:\\unzipped\\"));
    ZIPENTRY ze; 
    GetZipItem(hz,-1,&ze); 
    int numitems=ze.index;
    for (int zi=0; zi<numitems; zi++)
    {
        GetZipItem(hz,zi,&ze);
        UnzipItem(hz,zi,ze.name);
    }
    CloseZip(hz);
    printf("Unzipped\n");   
    return 0;
}
但这正是造成问题的原因。当我调试程序并将watch添加到变量“name”中时,我看到在输入后,它存储了一些中文字母,而不是zip文件的路径

以前,当我没有从用户那里获取输入时,代码工作得很好,我硬编码了路径和文件名,如下所述

hz = OpenZip(_T("D:\\folder\\sample.zip"),0);
知道我做错了什么吗?

Windows文件系统(NTFS、FAT32)用Unicode(UTF16)编码文件名。这就是为什么
OpenZip
API希望使用wchar\u t*(宽字符字符串)作为文件名参数的原因

C++标准提供了类似于假定包含Unicode字符的ANSI字符串(或C字符串)和<代码> > WCIN < /Code >和 WcOUT流输入/输出的Unicode编码的<>代码> WString 类。p>

wstring wfilename; 
std::wcin >> wfilename;
OpenZip(wfilename.c_str(), 0); // c_str() retrives the wchar_t* in the buffer, much similarly to the ANSI `string.
编辑: 由于您需要输入到C样式的缓冲区中,下面是将C样式的char[]转换为wstring和wchar_t[]的最简单方法:

char filename[100]; printf("Enter filename: \n");   cin >> filename;

// conversion
std::wstring wFilename(strlen(filename), L' ');
std::copy(filename, filename + wFilename.length(), wFilename.begin());


OpenZip(wFilename.c_str(), 0);
Windows文件系统(NTFS、FAT32)以Unicode(UTF16)编码文件名。这就是为什么
OpenZip
API希望使用wchar\u t*(宽字符字符串)作为文件名参数的原因

C++标准提供了类似于假定包含Unicode字符的ANSI字符串(或C字符串)和<代码> > WCIN < /Code >和 WcOUT流输入/输出的Unicode编码的<>代码> WString 类。p>

wstring wfilename; 
std::wcin >> wfilename;
OpenZip(wfilename.c_str(), 0); // c_str() retrives the wchar_t* in the buffer, much similarly to the ANSI `string.
编辑: 由于您需要输入到C样式的缓冲区中,下面是将C样式的char[]转换为wstring和wchar_t[]的最简单方法:

char filename[100]; printf("Enter filename: \n");   cin >> filename;

// conversion
std::wstring wFilename(strlen(filename), L' ');
std::copy(filename, filename + wFilename.length(), wFilename.begin());


OpenZip(wFilename.c_str(), 0);

可能有帮助:不是真的@A.S.h您能试试这个:
wstring filename;std::wcin>>文件名;OpenZip(filename.c_str(),0)太好了。它就像一个符咒!你能解释一下这是怎么回事吗@A.S.HAny知道我做错了什么<代码>TCHAR*名称=(TCHAR*)文件名如果char与TCHAR不同,则这是一个错误。强制转换会使编译器静音,但不会修复问题。可能有帮助:不太可能@A.S.h是否尝试以下操作:
wstring filename;std::wcin>>文件名;OpenZip(filename.c_str(),0)太好了。它就像一个符咒!你能解释一下这是怎么回事吗@A.S.HAny知道我做错了什么<代码>TCHAR*名称=(TCHAR*)文件名如果char与TCHAR不同,则这是一个错误。强制转换会使编译器静音,但无法解决问题。是否有任何方法可以将我的char文件名[100]转换为wstring?因为我必须在字符数组中接受输入有一定的限制:/这太完美了!也谢谢你的解释,真的很感激it@user52327我很高兴它有帮助:)有没有办法将我的char文件名[100]转换成wstring?因为我必须在字符数组中接受输入有一定的限制:/这太完美了!也谢谢你的解释,真的很感激it@user52327我很高兴这有帮助:)