操作wchar时出现问题 我是C++新手。我正试图在目录中列出文件。我用的是unicode。问题不是列出文件,而是用wchar*处理字符串和路径,我快疯了。以下是我的测试代码: #define UNICODE 1 #include <stdio.h> #include <windows.h> #include <wchar.h> int wmain(int argc,wchar_t **argv){ if (argc > 1){ wchar_t* path=argv[1]; wchar_t* pwc; int last_occurence; pwc=wcsrchr(path,L'\\'); last_occurence = pwc-path+1; int len = wcslen(path); if (last_occurence == len){ //slash }else{ //no slash wcscat(path,L"\\"); } wcscat(path,L"*"); WIN32_FIND_DATA FindData; HANDLE hSearch; hSearch = FindFirstFile(path , &FindData); if(hSearch == INVALID_HANDLE_VALUE){ return -1; }else{ // *** PROBLEM STARTS HERE wchar_t* filePath=NULL; do{ wcscpy(filePath,path); wcscat(filePath,FindData.cFileName); wprintf(L"Path %s\n",filePath); memset(filePath, '\0', wcslen(filePath)); // *** PROBLEM ENDS HERE }while( FindNextFile(hSearch, &FindData) > 0 ); int ret = FindClose(hSearch); return 0; } } } #定义UNICODE 1 #包括 #包括 #包括 内部wmain(内部argc,wchar\u t**argv){ 如果(argc>1){ wchar_t*path=argv[1]; wchar_t*普华永道; int最后一次出现; pwc=wcsrchr(路径,L'\\'); 最后一次出现=pwc路径+1; int len=wcslen(路径); 如果(上次发生==len){ //刀砍 }否则{ //没有斜线 wcscat(路径,L“\\”); } wcscat(路径,L“*”); WIN32_FIND_DATA FindData; 手感研究; hSearch=FindFirstFile(路径和FindData); if(hSearch==无效的句柄值){ 返回-1; }否则{ //***问题从这里开始 wchar_t*filePath=NULL; 做{ wcscpy(文件路径,路径); wcscat(文件路径,FindData.cFileName); wprintf(L“路径%s\n”,文件路径); memset(文件路径'\0',wcslen(文件路径)); //***问题到此结束 }而(FindNextFile(hSearch和FindData)>0); int-ret=FindClose(hSearch); 返回0; } } }
当我运行编译后的应用程序时,它停止响应。我要做的是打印我传递给我的应用程序的路径(c:\dir1\dir2)并将文件附加到其中(file1,file2),如下所示: c:\dir1\dir2\file1 c:\dir1\dir2\file2操作wchar时出现问题 我是C++新手。我正试图在目录中列出文件。我用的是unicode。问题不是列出文件,而是用wchar*处理字符串和路径,我快疯了。以下是我的测试代码: #define UNICODE 1 #include <stdio.h> #include <windows.h> #include <wchar.h> int wmain(int argc,wchar_t **argv){ if (argc > 1){ wchar_t* path=argv[1]; wchar_t* pwc; int last_occurence; pwc=wcsrchr(path,L'\\'); last_occurence = pwc-path+1; int len = wcslen(path); if (last_occurence == len){ //slash }else{ //no slash wcscat(path,L"\\"); } wcscat(path,L"*"); WIN32_FIND_DATA FindData; HANDLE hSearch; hSearch = FindFirstFile(path , &FindData); if(hSearch == INVALID_HANDLE_VALUE){ return -1; }else{ // *** PROBLEM STARTS HERE wchar_t* filePath=NULL; do{ wcscpy(filePath,path); wcscat(filePath,FindData.cFileName); wprintf(L"Path %s\n",filePath); memset(filePath, '\0', wcslen(filePath)); // *** PROBLEM ENDS HERE }while( FindNextFile(hSearch, &FindData) > 0 ); int ret = FindClose(hSearch); return 0; } } } #定义UNICODE 1 #包括 #包括 #包括 内部wmain(内部argc,wchar\u t**argv){ 如果(argc>1){ wchar_t*path=argv[1]; wchar_t*普华永道; int最后一次出现; pwc=wcsrchr(路径,L'\\'); 最后一次出现=pwc路径+1; int len=wcslen(路径); 如果(上次发生==len){ //刀砍 }否则{ //没有斜线 wcscat(路径,L“\\”); } wcscat(路径,L“*”); WIN32_FIND_DATA FindData; 手感研究; hSearch=FindFirstFile(路径和FindData); if(hSearch==无效的句柄值){ 返回-1; }否则{ //***问题从这里开始 wchar_t*filePath=NULL; 做{ wcscpy(文件路径,路径); wcscat(文件路径,FindData.cFileName); wprintf(L“路径%s\n”,文件路径); memset(文件路径'\0',wcslen(文件路径)); //***问题到此结束 }而(FindNextFile(hSearch和FindData)>0); int-ret=FindClose(hSearch); 返回0; } } },c++,string,path,wchar-t,C++,String,Path,Wchar T,当我运行编译后的应用程序时,它停止响应。我要做的是打印我传递给我的应用程序的路径(c:\dir1\dir2)并将文件附加到其中(file1,file2),如下所示: c:\dir1\dir2\file1 c:\dir1\dir2\file2 如何解决这个问题?有最好的方法来做这样的事情吗?如果可能的话,我将继续使用wchar而不是std字符串您的代码有一些问题 您正在将“\\*”连接到argv[1]指向的内存,这是错误的。您需要将path从wchar\u t*指针更改为wchar\u t[]数
如何解决这个问题?有最好的方法来做这样的事情吗?如果可能的话,我将继续使用wchar而不是std字符串您的代码有一些问题
- 您正在将
连接到“\\*”
指向的内存,这是错误的。您需要将argv[1]
从path
指针更改为wchar\u t*
数组,然后wchar\u t[]
将wcscpy
数据插入其中argv[1]
- 您没有为
分配任何内存,因此filePath
和wcscpy()
正在写入无效内存。您还需要将wcscat()
更改为filePath
数组,然后wchar\u t[]
/wcscpy
将路径数据导入其中wcscat
- 将
和路径
值组合在一起时,也不会忽略连接的文件名
*
- 您根本不需要
(特别是因为您给它的字节计数是错误的)memset()
#define UNICODE 1
#include <stdio.h>
#include <windows.h>
#include <wchar.h>
int wmain(int argc, wchar_t **argv)
{
if (argc < 2)
{
wprintf(L"Usage: \"%s\" path\n", argv[0]);
return -1;
}
int len = wcslen(argv[1]);
if (len >= MAX_PATH)
{
wprintf(L"Path is too long\n");
return -1;
}
wchar_t path[MAX_PATH+1] = {};
wcscpy(path, argv[1]);
if ((len > 0) && (path[len-1] != L'\\'))
wcscat(path, L"\\");
wchar_t searchMask[MAX_PATH+2] = {};
wcscpy(searchMask, path);
wcscat(searchMask, L"*");
WIN32_FIND_DATA FindData;
HANDLE hSearch = FindFirstFileW(searchMask, &FindData);
if (hSearch == INVALID_HANDLE_VALUE)
{
if (GetLastError() != ERROR_FILE_NOT_FOUND)
{
wprintf(L"Error looking for first file\n");
return -1;
}
wprintf(L"No files found\n");
}
else
{
wchar_t filePath[MAX_PATH*2];
do
{
wcscpy(filePath, path);
wcscat(filePath, FindData.cFileName);
wprintf(L"Path %s\n", filePath);
}
while (FindNextFileW(hSearch, &FindData));
if (GetLastError() != ERROR_NO_MORE_FILES)
{
FindClose(hSearch);
wprintf(L"Error looking for next file\n");
return -1;
}
FindClose(hSearch);
}
return 0;
}
或者,如果您没有使用C++11编译器:
#define UNICODE 1
#include <windows.h>
#include <wchar.h>
#include <iostream>
#include <string>
class FindHandle
{
private:
HANDLE m_hFind;
public:
FindHandle(HANDLE hFind) : m_hFind(hFind) {}
~FindHandle()
{
if (m_hFind != INVALID_HANDLE_VALUE)
FindClose(m_hFind);
}
HANDLE get() { return m_hFind; }
};
int wmain(int argc, wchar_t **argv)
{
if (argc < 2)
{
std::wcerr << L"Usage: \"" << argv[0] << L"\" path" << std::endl;
return -1;
}
std::wstring path = argv[1];
if ((!path.empty()) && (path[path.length()-1] != L'\\'))
path += L'\\';
WIN32_FIND_DATA FindData;
FindHandle hSearch(FindFirstFileW((path + L"*").c_str(), &FindData));
if (hSearch.get() == INVALID_HANDLE_VALUE)
{
if (GetLastError() != ERROR_FILE_NOT_FOUND)
{
std::wcerr << L"Error looking for first file" << std::endl;
return -1;
}
std::wcout << L"No files found" << std::endl;
}
else
{
do
{
std::wstring filePath = path + FindData.cFileName;
std::wcout << L"Path " << filePath << std::endl;
}
while (FindNextFileW(hSearch.get(), &FindData));
if (GetLastError() != ERROR_NO_MORE_FILES)
{
std::wcerr << L"Error looking for next file" << std::endl;
return -1;
}
}
return 0;
}
#定义UNICODE 1
#包括
#包括
#包括
#包括
FindHandle类
{
私人:
处理m_hFind;
公众:
FindHandle(HANDLE-hFind):m_-hFind(hFind){}
~FindHandle()
{
if(m_hFind!=无效的\u句柄\u值)
FindClose(m_hFind);
}
句柄get(){return m_hFind;}
};
内部wmain(内部argc,wchar\u t**argv)
{
如果(argc<2)
{
std::wcerr为什么不std::string
?@grantgarison在这种情况下,您的意思是std::wstring
。调试器说了什么?@Grant没有真正的理由。我不喜欢std::string的语法。我想保留与旧c示例更相似的语法。@LightnessRacesinOrbit我在控制台中运行编译的exe。app停止响应,操作系统在没有来自Debugger的任何其他消息的情况下终止它。我尝试了它,它工作得很好,也更优雅。我必须更深入地研究。非常感谢现在我很抱歉,我现在只尝试第二个示例(第一个非常有效)。除了理解std::unique\u ptr的困难之外,它似乎无法正常工作:错误C2039:“unique\u ptr”:不是“std”错误C2065:“unique\u ptr”:未声明的标识符错误C2275:“HANDLE”:非法使用此类型作为表达式我想更好地了解它是如何工作的std::unique\u ptr
在C++11中,请确保您使用的是支持C++11的编译器。有些编译器,如gcc,要求您显式配置它们以启用C++11,即-std=C++11
。如果您不使用C++11ah,我添加了另一个示例好的,我使用的是vc++2008
#define UNICODE 1
#include <windows.h>
#include <wchar.h>
#include <iostream>
#include <string>
class FindHandle
{
private:
HANDLE m_hFind;
public:
FindHandle(HANDLE hFind) : m_hFind(hFind) {}
~FindHandle()
{
if (m_hFind != INVALID_HANDLE_VALUE)
FindClose(m_hFind);
}
HANDLE get() { return m_hFind; }
};
int wmain(int argc, wchar_t **argv)
{
if (argc < 2)
{
std::wcerr << L"Usage: \"" << argv[0] << L"\" path" << std::endl;
return -1;
}
std::wstring path = argv[1];
if ((!path.empty()) && (path[path.length()-1] != L'\\'))
path += L'\\';
WIN32_FIND_DATA FindData;
FindHandle hSearch(FindFirstFileW((path + L"*").c_str(), &FindData));
if (hSearch.get() == INVALID_HANDLE_VALUE)
{
if (GetLastError() != ERROR_FILE_NOT_FOUND)
{
std::wcerr << L"Error looking for first file" << std::endl;
return -1;
}
std::wcout << L"No files found" << std::endl;
}
else
{
do
{
std::wstring filePath = path + FindData.cFileName;
std::wcout << L"Path " << filePath << std::endl;
}
while (FindNextFileW(hSearch.get(), &FindData));
if (GetLastError() != ERROR_NO_MORE_FILES)
{
std::wcerr << L"Error looking for next file" << std::endl;
return -1;
}
}
return 0;
}