xengine-qyt 2023-02-27 08:13 采纳率: 89.5%
浏览 19
已结题

vs2022 c语言 Unicode 读写文件的问题

windows 10 c语言 unicode 读写文件的问题

我有一个UNICODE写的文件

我读取的时候


    FILE* pSt_File = _tfopen(_T("D:\\1\\x64\\Debug\\1.txt"), _T("r+"));
    if (NULL == pSt_File)
    {
        int nRet = errno;
        return FALSE;
    }
    int nMsgLen = 1024;
    TCHAR* ptszMsgBuffer = (TCHAR*)malloc(1024);
    if (NULL == ptszMsgBuffer)
    {
        return FALSE;
    }
    memset(ptszMsgBuffer, '\0', 1024);

    size_t nRet = fread(ptszMsgBuffer, sizeof(TCHAR), 1024, pSt_File);
    fclose(pSt_File);

fread 永远返回0 ,但是我改成 fread(ptszMsgBuffer, sizeof(CHAR), 1024, pSt_File);
就正常了,为啥unicode下参数2要1个字节大小啊?

  • 写回答

1条回答 默认 最新

  • Web Security Loop 2023-02-27 08:19
    关注

    因为在 Windows 平台下,unicode 使用的是 utf16 编码,一个字符占用两个字节。你要用 unicode 编码读取文件内容的话,那么你应该使用 wchar_t 类型的缓冲区来存储读取到的数据,而不是 tchar 类型的缓冲区。

    FILE* pSt_File = _wfopen(L"D:\\1\\x64\\Debug\\1.txt", L"r");
    if (NULL == pSt_File)
    {
        int nRet = errno;
        return FALSE;
    }
    
    int nMsgLen = 1024;
    wchar_t* pwchMsgBuffer = (wchar_t*)malloc(nMsgLen * sizeof(wchar_t));
    if (NULL == pwchMsgBuffer)
    {
        return FALSE;
    }
    memset(pwchMsgBuffer, L'\0', nMsgLen * sizeof(wchar_t));
    
    size_t nRet = fread(pwchMsgBuffer, sizeof(wchar_t), nMsgLen - 1, pSt_File);
    if (nRet == 0)
    {
        // 读取文件失败
        fclose(pSt_File);
        return FALSE;
    }
    
    // 将读取到的内容输出到控制台
    wprintf(L"Read content: %ls\n", pwchMsgBuffer);
    
    fclose(pSt_File);
    
    
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月23日
  • 已采纳回答 3月16日
  • 创建了问题 2月27日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部