记录fstream类读取UTF-8时出现乱码问题以及fstream读文件的几种方法

1.处理fstream类读取UTF-8时出现乱码问题,思路先将utf-8转换成UNICODE 再转化成ANSI#include <string>#include<fstream>using namespace std;string changeUTF8ToAnsi(const char * szU8){ int wcsLen = ::Mult...
摘要由CSDN通过智能技术生成

1.处理fstream类读取UTF-8时出现乱码问题,思路先将utf-8转换成UNICODE 再转化成ANSI

#include <string>
#include<fstream>
using namespace std;
string changeUTF8ToAnsi(const char * szU8)
{
    
    int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), NULL, 0);
    wchar_t* wszMultiByte = new wchar_t[wcsLen + 1];
    ::MultiByteToWideChar(CP_UTF8, NULL, szU8, strlen(szU8), wszMultiByte, wcsLen);
    wszMultiByte[wcsLen] = '\0';
 
    int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszMultiByte, wcslen(wszMultiByte), NULL, 0, NULL, NULL);
    char* szAnsi = new char[ansiLen + 1];
    szAnsi[ansiLen] = '\0';
    ::WideCharToMultiByte(CP_ACP, NULL, wszMultiByte, wcslen(wszMultiByte), szAnsi, ansiLen, NULL, NULL);
    string s=szAnsi;
    delete []szAnsi;
    delete []wszMultiByte;

    return s;
}

2.记录下fstream读取文件

s
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是您需要的解决方案: 1. 首先,您需要使用 Unicode 编码来读取 UTF-8 文件,因为 UTF-8 使用的是多字节编码。您可以使用 `wifstream` 来打开文件,使用 `wstringstream` 来读取文件内容,并使用 `wstring` 存储读取的字符串。 2. 接下来,您需要将读取到的字符串按照您的需求进行分割。您可以使用 `wistringstream` 将字符串分割成单独的项,并逐个添加到您的 `listctrl` 控件中。 3. 为了避免中文乱码,您需要将您的程序的默认编码设置为 UTF-8。您可以使用以下代码来设置: ``` setlocale(LC_ALL, "en_US.UTF-8"); ``` 4. 最后,根据您的要求,您需要使用 `listctrl` 控件的 `InsertColumn` 和 `InsertItem` 方法来创建至少四行四列的表格,并将分割后的项逐个添加到表格中。 下面是一个完整的示例代码,您可以参考一下: ```c++ #include <fstream> #include <sstream> #include <vector> #include <iostream> #include <locale.h> #include <afxwin.h> using namespace std; int main() { // 设置默认编码为 UTF-8 setlocale(LC_ALL, "en_US.UTF-8"); // 打开文件 wifstream file("test.txt"); // 读取文件内容 wstringstream buffer; buffer << file.rdbuf(); wstring content = buffer.str(); // 分割字符串 vector<wstring> items; wistringstream iss(content); wstring item; while (getline(iss, item, L'\t')) { items.push_back(item); } // 创建表格 CListCtrl listctrl; listctrl.Create(WS_VISIBLE | WS_BORDER | LVS_REPORT, CRect(10, 10, 300, 200), NULL, NULL); listctrl.InsertColumn(0, L"列1", LVCFMT_LEFT, 100); listctrl.InsertColumn(1, L"列2", LVCFMT_LEFT, 100); listctrl.InsertColumn(2, L"列3", LVCFMT_LEFT, 100); listctrl.InsertColumn(3, L"列4", LVCFMT_LEFT, 100); // 添加数据 int row = 0; for (int i = 0; i < 16; i += 4) { listctrl.InsertItem(row, items[i].c_str()); listctrl.SetItemText(row, 1, items[i + 1].c_str()); listctrl.SetItemText(row, 2, items[i + 2].c_str()); listctrl.SetItemText(row, 3, items[i + 3].c_str()); row++; } return 0; } ``` 注意:由于我不知道您的具体环境和要求,以上代码可能需要进行一些修改才能正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值