Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
操作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 - Fatal编程技术网 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" /> 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" />

操作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; } } }

操作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[]数

当我运行编译后的应用程序时,它停止响应。我要做的是打印我传递给我的应用程序的路径(c:\dir1\dir2)并将文件附加到其中(file1,file2),如下所示:

c:\dir1\dir2\file1

c:\dir1\dir2\file2


如何解决这个问题?有最好的方法来做这样的事情吗?如果可能的话,我将继续使用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;
}