如何在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
相关产品推荐
相关产品推荐

