You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中使用CreateFile读取Unicode文件并写入wstring?

读取带Unicode路径的文件并写入std::wstring

你当前的代码已经能通过CreateFileW正确读取带Unicode路径的文件,要将文件内容写入std::wstring而非控制台输出,只需调整内容存储逻辑即可,以下是修改后的实现:

#include <iostream>
#include <string>
#include <windows.h>

int main()
{
    // 打开带Unicode路径的文件
    HANDLE hFileHandle = CreateFileW(L"D:\\Çağatay.txt", GENERIC_READ, FILE_SHARE_READ, 
                                     NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFileHandle == INVALID_HANDLE_VALUE) // 原代码判断NULL错误,Win32 API失败返回INVALID_HANDLE_VALUE
    {
        std::cerr << "文件打开失败,错误码:" << GetLastError() << std::endl;
        return 1;
    }

    // 获取文件大小,用于初始化wstring的存储空间
    LARGE_INTEGER fileSize;
    if (!GetFileSizeEx(hFileHandle, &fileSize))
    {
        std::cerr << "获取文件大小失败,错误码:" << GetLastError() << std::endl;
        CloseHandle(hFileHandle);
        return 1;
    }

    std::wstring fileContent;
    if (fileSize.QuadPart > 0)
    {
        // 字节数转wchar_t字符数,预留额外空间避免截断
        size_t charCount = fileSize.QuadPart / sizeof(wchar_t);
        fileContent.resize(charCount + 1);
        
        DWORD dwBytesRead = 0;
        // 直接读取到wstring的内部缓冲区
        if (!ReadFile(hFileHandle, &fileContent[0], static_cast<DWORD>(fileSize.QuadPart), &dwBytesRead, NULL))
        {
            std::cerr << "读取文件失败,错误码:" << GetLastError() << std::endl;
            CloseHandle(hFileHandle);
            return 1;
        }

        // 根据实际读取的字节数调整wstring长度
        charCount = dwBytesRead / sizeof(wchar_t);
        fileContent.resize(charCount);
        // 确保字符串以空字符结尾
        fileContent.push_back(L'\0');
    }

    // 此处可直接使用fileContent,比如验证输出(可选)
    std::wcout << fileContent << std::endl;

    CloseHandle(hFileHandle);
    std::cin.get();
    return 0;
}

关键修改说明

  • 修正文件打开的错误判断:原代码用hFileHandle != NULL是错误的,Win32 API中CreateFileW失败时返回INVALID_HANDLE_VALUE而非NULL,修正后能准确判断文件是否打开成功。
  • 动态适配文件大小:通过GetFileSizeEx获取文件实际大小,避免固定数组的容量限制,同时精准初始化std::wstring的存储空间。
  • 直接写入wstring缓冲区:利用&fileContent[0]获取std::wstring的内部字符缓冲区,直接传递给ReadFile,无需中间数组中转。
  • 处理字节与字符的转换:ReadFile返回的是读取的字节数,而wchar_t占2字节,需将字节数除以sizeof(wchar_t)得到实际字符数,再调整wstring的长度。
  • 保证字符串终止:读取完成后手动添加空字符,确保std::wstring符合C风格字符串的终止要求。

内容的提问来源于stack exchange,提问作者Çağatay KAYA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:43:10