wchar_t name[50] = L"#G你好"; wprintf(L"%s\n", name);为什么我输出的是乱码,用mfc分配的工作台
时间: 2024-05-04 19:19:26 浏览: 11
如果你在使用 MFC 的工作台应用程序并且在输出宽字符时遇到了乱码问题,可能是因为你的控制台窗口没有正确地设置字体。MFC 的工作台应用程序默认使用 Consolas 字体,但是 Consolas 字体在一些操作系统上可能不包含所有的 Unicode 字符。
你可以尝试更改控制台窗口的字体以显示宽字符。在控制台窗口上单击右键,然后选择“属性”,在“字体”选项卡中选择一个支持 Unicode 的字体,例如“Lucida Console”或“Microsoft YaHei”。然后再次运行程序,看看输出是否正确。
另外,你的代码中使用了 `%s` 格式化字符串来输出一个宽字符字符串,应该使用 `%ls` 格式化字符串来输出宽字符字符串。所以你可以尝试修改代码:
```c++
wchar_t name[50] = L"#G你好";
wprintf(L"%ls\n", name);
```
这样应该可以正确地输出宽字符字符串。
相关问题
for(int j=0;j<numbooks;j++) { printf("%5s\t%15s\t%10s\t%25s\n",bookList[j].id,bookList[j].name,bookList[j].author,bookList[j].press); }怎么改进
可以改进为以下代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
typedef struct {
char id[30];
char name[30]; //书名
char author[30]; //作者
char press[30]; //出版社名
int available;//1表示未借出,0表示已借出
} Book;
Book bookList[MAX_BOOKS]=
{
{"1","唐诗三百首","孙洙","南京大学出版社",1},
{"2","三体","刘慈欢","北美权威科幻类出版社",1},
{"3","稻草人","叶圣陶","湖南儿童出版社",1},
{"4","老人与海","海明威","上海译文出版社",1},
{"5","c语言","泰戈尔","浙江文艺出版社",1}
};
int main()
{
int numbooks = 5;
setlocale(LC_ALL, ""); // 设置本地化环境为系统默认
for(int j=0;j<numbooks;j++) {
wprintf(L"%5S\t%15S\t%10S\t%25S\n", bookList[j].id, bookList[j].name, bookList[j].author, bookList[j].press);
}
return 0;
}
```
在上面的代码中,我们使用了宽字符类型 `wprintf` 函数,这样就可以直接输出 Unicode 编码的字符了。同时,我们使用了 `setlocale` 函数将本地化环境设置为系统默认,这样就可以在不同的系统环境中正确输出中文字符了。
注意,在使用 `wprintf` 函数时,需要将 `char` 类型的字符串转换成 `wchar_t` 类型的字符串,以便正确输出中文字符。因此,在书名、作者和出版社名中包含中文字符时,需要将这些字符串定义为宽字符类型 `wchar_t` 类型的字符串,如下所示:
```c
typedef struct {
char id[30];
wchar_t name[30]; //宽字符类型的书名
wchar_t author[30]; //宽字符类型的作者
wchar_t press[30]; //宽字符类型的出版社名
int available;//1表示未借出,0表示已借出
} Book;
Book bookList[MAX_BOOKS]=
{
{"1", L"唐诗三百首", L"孙洙", L"南京大学出版社", 1},
{"2", L"三体", L"刘慈欢", L"北美权威科幻类出版社", 1},
{"3", L"稻草人", L"叶圣陶", L"湖南儿童出版社", 1},
{"4", L"老人与海", L"海明威", L"上海译文出版社", 1},
{"5", L"c语言", L"泰戈尔", L"浙江文艺出版社", 1}
};
```
CLSIDFromProgID(L"Excel.Application", &clsid) 使用WIN32 API 读取Excel表格 封装工具类
可以使用以下步骤封装一个工具类:
1. 在类的头文件中添加必要的头文件和类声明:
```c++
#include <Windows.h>
#include <ole2.h>
#include <olectl.h>
#include <atlbase.h>
class ExcelReader {
public:
ExcelReader();
~ExcelReader();
bool OpenFile(const wchar_t* fileName);
void CloseFile();
bool ReadCell(int row, int col, wchar_t* value, int len);
private:
void Init();
void Uninit();
bool GetActiveSheet();
bool GetCell(int row, int col, IDispatch** cell);
bool GetCellValue(IDispatch* cell, wchar_t* value, int len);
CComPtr<IDispatch> m_pExcelApp;
CComPtr<IDispatch> m_pWorkbook;
CComPtr<IDispatch> m_pActiveSheet;
};
```
2. 在类的实现文件中添加必要的函数实现:
```c++
ExcelReader::ExcelReader() {
Init();
}
ExcelReader::~ExcelReader() {
Uninit();
}
void ExcelReader::Init() {
CoInitialize(NULL);
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);
if (SUCCEEDED(hr)) {
hr = m_pExcelApp.CoCreateInstance(clsid);
if (SUCCEEDED(hr)) {
m_pExcelApp->PutVisible(VARIANT_FALSE);
}
}
}
void ExcelReader::Uninit() {
CloseFile();
m_pExcelApp.Release();
CoUninitialize();
}
bool ExcelReader::OpenFile(const wchar_t* fileName) {
if (!m_pExcelApp) {
return false;
}
CloseFile();
VARIANT result;
VariantInit(&result);
VARIANT file_name;
VariantInit(&file_name);
file_name.vt = VT_BSTR;
file_name.bstrVal = SysAllocString(fileName);
HRESULT hr = m_pExcelApp->GetWorkbooks()->Open(
file_name,
VARIANT(),
VARIANT(),
VARIANT(),
VARIANT(),
VARIANT(),
VARIANT(),
VARIANT(),
VARIANT(),
VARIANT(),
VARIANT(),
VARIANT(),
VARIANT(),
&result
);
VariantClear(&file_name);
if (SUCCEEDED(hr)) {
m_pWorkbook.Attach(result.pdispVal);
return GetActiveSheet();
}
return false;
}
void ExcelReader::CloseFile() {
m_pActiveSheet.Release();
m_pWorkbook.Release();
}
bool ExcelReader::ReadCell(int row, int col, wchar_t* value, int len) {
if (!m_pActiveSheet) {
return false;
}
CComPtr<IDispatch> cell;
if (!GetCell(row, col, &cell)) {
return false;
}
return GetCellValue(cell, value, len);
}
bool ExcelReader::GetActiveSheet() {
if (!m_pWorkbook) {
return false;
}
VARIANT result;
VariantInit(&result);
HRESULT hr = m_pWorkbook->GetActiveSheet(&result);
if (SUCCEEDED(hr)) {
m_pActiveSheet.Attach(result.pdispVal);
return true;
}
return false;
}
bool ExcelReader::GetCell(int row, int col, IDispatch** cell) {
if (!m_pActiveSheet) {
return false;
}
VARIANT result;
VariantInit(&result);
VARIANT vtRow;
vtRow.vt = VT_INT;
vtRow.intVal = row;
VARIANT vtCol;
vtCol.vt = VT_INT;
vtCol.intVal = col;
HRESULT hr = m_pActiveSheet->Invoke(
DISPID_VALUE,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET,
&result,
NULL,
NULL,
NULL
);
if (SUCCEEDED(hr)) {
CComPtr<IDispatch> range(result.pdispVal);
hr = range->Invoke(
DISPID_VALUE,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_METHOD,
&result,
NULL,
NULL,
NULL
);
if (SUCCEEDED(hr)) {
*cell = result.pdispVal;
return true;
}
}
return false;
}
bool ExcelReader::GetCellValue(IDispatch* cell, wchar_t* value, int len) {
VARIANT result;
VariantInit(&result);
HRESULT hr = cell->Invoke(
DISPID_VALUE,
IID_NULL,
LOCALE_USER_DEFAULT,
DISPATCH_PROPERTYGET,
&result,
NULL,
NULL,
NULL
);
if (SUCCEEDED(hr)) {
if (result.vt == VT_BSTR) {
wcsncpy_s(value, len, result.bstrVal, _TRUNCATE);
VariantClear(&result);
return true;
}
}
return false;
}
```
3. 使用工具类读取 Excel 表格:
```c++
int main() {
ExcelReader reader;
if (!reader.OpenFile(L"example.xlsx")) {
printf("Failed to open file.\n");
return 1;
}
wchar_t value[256] = { 0 };
if (reader.ReadCell(1, 1, value, sizeof(value) / sizeof(wchar_t))) {
wprintf(L"Value of A1: %s\n", value);
}
reader.CloseFile();
return 0;
}
```
这个工具类使用了 ATL 库来简化 COM 的使用,使用者只需要创建一个 ExcelReader 对象,调用 OpenFile 方法打开一个 Excel 文件,再调用 ReadCell 方法读取指定单元格的值即可。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![application/x-zip](https://img-home.csdnimg.cn/images/20210720083736.png)