首页 > 其他分享 >使用EasyX制作游戏需要读写文件时遇到编码问题的解决方法

使用EasyX制作游戏需要读写文件时遇到编码问题的解决方法

时间:2024-05-25 20:44:25浏览次数:10  
标签:std 编码 int 读写 EasyX str InputBox include

使用EasyX制作游戏需要读写文件时遇到编码问题的解决方法

一、编码问题

例如我们需要从file.txt中读取文字,再使用outtextxy()函数向窗口绘制文字。
查找EasyX的官方文档可知,该函数有两个重载,分别为:void outtextxy(int x, int y, LPCTSTR str)void outtextxy(int x, int y, TCHAR c)
如果我们的file.txt文件使用GBK或者GB2312编码的话,会导致VS编译器混合utf-8编码和GBK编码,导致程序不能正确绘制文字。
编码问题一直是令人头痛的问题,这里给出通用的方法论,希望能够带来一些帮助。

二、解决方法

1.重新编码txt文件

首先使用vscode打开file.txt文件,确保文件编码为utf-8。如下图:

如果不是utf-8编码,点击选择编码,通过编码重新打开,选择utf-8编码,这时原来的内容会变成乱码,将原来的内容删除,重新输入,保存即可。具体的操作如下图:


2.代码部分

首先,我们需要用到std::wstring_convert,这个标准库需要头文件#include<codecvt>,我们定义string str,用static std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;定义我们所需要的从utf-8编码的字符串到宽字符串的转换器。
打开文件,读取文件内容到str内,使用from_bytes(str)函数即可实现字符串的转换,又由于outtextxy没有使用wstring的重载,使用wstring的成员函数c_str()即可转换成wchar_t字符串,最终,我们用这样的代码将文字绘制在窗口上outtextxy(10, 10, converter.from_bytes(str).c_str());
效果如图:

完整代码如下:

#include<fstream>
#include<codecvt>
#include<string>
#include<iostream>
#include<graphics.h>

std::string str;

int main()
{
	initgraph(500, 500);

	static std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;

	std::ifstream infile("file.txt");
	if (!infile)
	{
		std::cerr << "无法打开文件" << std::endl;
		return 0;
	}
	std::getline(infile, str);
	infile.close();

	while (true)
	{
		outtextxy(10, 10, converter.from_bytes(str).c_str());
	}
}

三、问题延伸

如果我们需要在程序内使用InputBox对话框输入,并将输入的内容正确保存在文件里,该如何操作呢。
首先查看InputBox的定义bool InputBox(LPTSTR pString, int nMaxCount, LPCTSTR pPrompt = NULL, LPCTSTR pTitle = NULL, LPCTSTR pDefault = NULL, int width = 0, int height = 0, bool bOnlyOK = true);,其中大部分是默认参数,这里不做解释,重点是第一个参数,InputBox只接受&wchar_t的参数,因此,假设输入的字符串最大长度为256,我们定义TCHAR buffer[256];数组来接收输入,写下这样的代码来弹出对话框InputBox(buffer, 256, _T("请输入:"), _T("输入框"), NULL, 0, 0, TRUE);打开文件,定义std::string str;,仍然使用我们刚才定义的转换器,使用to_bytes()函数,即可将输入的内容转换为utf-8字符串。再进行输入即可。
完整代码如下:

#include<fstream>
#include<codecvt>
#include<string>
#include<iostream>
#include<graphics.h>

int main()
{
	initgraph(500, 500);

	static std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;

	TCHAR buffer[256];
	InputBox(buffer, 256, _T("请输入:"), _T("输入框"), NULL, 0, 0, TRUE);

	std::ofstream outfile("file.txt");
	if (!outfile)
	{
		std::cerr << "无法打开文件" << std::endl;
		return 0;
	}
	std::string str = converter.to_bytes(buffer);
	outfile << str;
	outfile.close();
}

标签:std,编码,int,读写,EasyX,str,InputBox,include
From: https://www.cnblogs.com/suang/p/18212954

相关文章

  • 互斥锁、自旋锁、读写锁、悲观锁和乐观锁
    都有哪些锁?互斥锁、自旋锁、读写锁、乐观锁、悲观锁。互斥锁与自旋锁加锁的目的就是保证共享资源在任意时间里,只有一个线程访问,这样就可以避免多线程导致共享数据错乱的问题。当已经有一个线程加锁后,其他线程加锁则就会失败,互斥锁和自旋锁对于加锁失败后的处理方式是不......
  • python基础 - 文件的读写和yaml文件读取
    读取文件读取文件用withopen(文件路径,读写模式)r读(默认值),w写,a追加写#读文件的几种方式:1、read()返回文件内容,返回的是字符串filepath='D:/note1.txt'withopen(filepath,'r')asf:print(f.read())2、readLine()返回文件一行的内容,返回的是字符串withopen(filepath,'r')as......
  • 关于怎样解决pycharm中编码格式的问题
            首先,需要清楚pycharm中它自行默认设置的格式是GBK或是UTF-8,而GBK解释器可能会因为文件的信息写入与读取而返回错误。        在PyCharm中修改编码格式可以通过以下步骤实现:打开需要修改编码格式的文件点击菜单栏中的File--->Settings(或者快捷......
  • SQLServer通过发布订阅实现主从同步(读写分离)
    发布订阅实操:(1).启动SQLServer代理模式。 PS:从库也可以不用创建,因为在新建订阅的时候,可以选择自动创建,会自动同步数据库结构。 1.配置分发服务器(1). 如果是首次配置读写分离,需要配置分发服务器,后续不再配置。 如果不想用之前的分发服务器,可以右键复制,禁用分发服务器......
  • 什么是数据库读写分离
    有一些技术同学可能对于“读写分离”了解不多,认为数据库的负载问题都可以使用“读写分离”来解决。 这其实是一个非常大的误区,我们要用“读写分离”,首先应该明白“读写分离”是用来解决什么样的问题的,而不是仅仅会用这个技术。什么是读写分离?其实就是将数据库分为了主从库......
  • 文件的读写
    文件操作:1.打开文件2.读/写-----操作文件test.c------写(输出)------->文件test.c<------读(输入)--------文件文件名:文件路径+文件名主干+文件后缀文件指针:FILE*pf;//文件指针变量//打开文件FILE*fopen(constchar*filename,constchar*mode);//关闭文件intfclose......
  • 深度学习-nlp-NLP之trainsformer位置编码与余弦距离--77
    目录1.位置编码与词嵌入2.余弦距离1.位置编码与词嵌入importtorchimporttorch.nnasnnimportmath#定义词向量嵌入的大小d_model=512#定义位置编码的维度max_seq_len=5000#定义词向量嵌入层embedding=nn.Embedding(vocab_size,d_model)#定义位置编......
  • Chardet: 通用字符编码检测器
    Chardet:通用字符编码检测器构建状态图片PyPI上的最新版本许可证检测ASCII、UTF-8、UTF-16(2个变体)、UTF-32(4个变体)Big5、GB2312、EUC-TW、HZ-GB-2312、ISO-2022-CN(繁体和简体中文)EUC-JP、SHIFT_JIS、CP932、ISO-2022-JP(日语)EUC-KR、ISO-2022-KR、Johab(韩语)KOI8-R、MacCy......
  • MySQL几种编码格式的区别(utf8、utf8mb4、utf8mb4_general_ci、utf8mb4_unicode_ci 、u
    https://cloud.tencent.com/developer/article/1872879存储字符集utf8和utf8mb4utf8是Mysql中的一种字符集,只支持最长三个字节的UTF-8字符,也就是Unicode中的基本多文本平面。要在Mysql中保存4字节长度的UTF-8字符,需要使用utf8mb4字符集,但只有5.5.3版本以后......
  • 那些逃离北上广的程序员们,后来都怎么样了?| 编码人声
       「编码人声」是由「RTE开发者社区」策划的一档播客节目,关注行业发展变革、开发者职涯发展、技术突破以及创业创新,由开发者来分享开发者眼中的工作与生活。 近年来,许多开发者朋友纷纷「逃离」了一线城市,选择来到成本更低、生活节奏更舒适的地方,成为独立开发者。那么,这......