NEKO! 2024-02-18 17:23 采纳率: 66.7%
浏览 6

C++ string 转 wstring

最近写一个用于计算文件哈希值的函数,如下所示

std::string hash(const std::string& filePath)
{
    int wideStringLength = MultiByteToWideChar(CP_UTF8, 0, filePath.c_str(), -1, NULL, 0);
    std::wstring wideString(wideStringLength, L'\0');
    MultiByteToWideChar(CP_UTF8, 0, filePath.c_str(), -1, &wideString[0], wideStringLength);
    HANDLE fileHandle = CreateFile(wideString.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (fileHandle == INVALID_HANDLE_VALUE) {
        std::cerr << "Error opening file: " << GetLastError() << std::endl;
        return "";
    }
    ......
}

没问题的代码我省略了, 现在的问题是我创建了两个文件用于测试, 文件内容相同(因为是直接复制的), 只有文件名不同. 使用如下代码进行测试

std::cout << hash("config.ini") << "\n" << hash("config1.ini) << "\n";

结果是第一个文件被正常计算哈希值并输出, 第二个文件时输出Error opening file: 2
我又试了试其他的各种文件, 发现config.ini貌似是个个例, 其他文件也是输出Error opening file: 2
我怀疑是string转宽字符串wstring时有问题, 但我不确定具体是哪的问题, 帮帮我

  • 写回答

1条回答 默认 最新

  • GISer Liu 2024-02-18 17:28
    关注

    该回答引用自GPT-3.5,由博主GIS_Liu编写:

    问题分析:
    根据你的描述,出现问题的可能性主要集中在字符串转换部分和文件打开部分。首先,需要检查字符串转换是否正确,确保文件路径转换为宽字符串后能够正确打开文件。其次,需要检查文件是否存在以及是否有权限读取。

    解决方案:

    1. 修正字符串转换问题:在字符串转换时,需要确保正确地处理文件路径的特殊字符和编码格式。可以尝试使用不同的转换函数或者进行更加严格的错误处理。

    2. 检查文件路径:确认文件路径是否正确,文件是否存在以及是否有权限读取。可以通过输出文件路径来检查转换后的宽字符串是否正确。

    3. 检查文件打开权限:确保程序有足够的权限打开文件,特别是在试图读取第二个文件时出现错误的情况下。

    基于以上分析,可以按照以下步骤来修改代码:

    std::wstring filePathToWide(const std::string& filePath) {
        int wideStringLength = MultiByteToWideChar(CP_UTF8, 0, filePath.c_str(), -1, NULL, 0);
        std::wstring wideString(wideStringLength, L'\0');
        MultiByteToWideChar(CP_UTF8, 0, filePath.c_str(), -1, &wideString[0], wideStringLength);
        return wideString;
    }
    
    std::string hash(const std::string& filePath) {
        std::wstring wideFilePath = filePathToWide(filePath);
        
        HANDLE fileHandle = CreateFile(wideFilePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if (fileHandle == INVALID_HANDLE_VALUE) {
            std::cerr << "Error opening file: " << GetLastError() << std::endl;
            return "";
        }
        // 读取文件并计算哈希值的代码部分(省略)
        CloseHandle(fileHandle); // 记得关闭文件句柄
        return "placeholder_hash_value"; // 替换为实际的哈希值
    }
    

    在这个修改后的代码中,我引入了一个新的函数 filePathToWide 来封装字符串转换的逻辑,以便更好地重用和维护。同时,在 hash 函数中直接调用这个函数来获取宽字符串文件路径,以确保转换的正确性。然后,使用获取到的宽字符串路径打开文件,如果出现错误,则输出错误信息并返回空字符串。

    请尝试使用这个修改后的代码,并注意输出错误信息以帮助进一步排查问题。

    img

    如果该回答解决了您的问题,请采纳!如果没有,请详述问题所在!

    评论

报告相同问题?

问题事件

  • 创建了问题 2月18日