cpp: read and write utf-8 text file using vs 2022

news2024/11/24 23:06:12
/*****************************************************************//**
 * \file   geovindu.h
 * \brief  业务操作方法
 *
 * \author geovindu,Geovin Du
 * \date   2023-04-22
***********************************************************************/
/**
 * https://learn.microsoft.com/zh-cn/cpp/build/reference/utf-8-set-source-and-executable-character-sets-to-utf-8?view=msvc-170
 *
 * .
 */
 
 
#pragma once
 
#define _UNICODE
 
#ifndef GEOVINDU_H
#define GEOVINDU_H
 
#include <iostream>
#include <windows.h>
#include<string>
#include<string.h>
#include<fstream>
#include<stdio.h>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include <iostream>
#include <windows.h>
 
 
namespace geovindu
{
 
    class Geovin
    {
 
    private:
 
    public:
 
 
        /// <summary>
        ///
        /// </summary>
        /// <param name="buffer"></param>
        /// <param name="len"></param>
        /// <returns></returns>
        //string to_utf8(const wchar_t* buffer, int len);
        /// <summary>
        ///
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        //string to_utf8(const wstring& str);
 
        /// <summary>
        ///
        /// </summary>
        /// <param name="str"></param>
        //void createFile(wstring& str);
        /// <summary>
        /// 写成UTF-8文本文件
        /// </summary>
        void createFile();
 
    };
 
};
 
 
#endif
#define UNICODE

#define _UNICODE
 
#include <iostream>
#include <windows.h>
#include<string>
#include<string.h>
#include<fstream>
#include<stdio.h>
#include<cstdlib>
#include<cstring>
#include<iomanip>
#include "geovindu.h"
 
 
using namespace std;
 
namespace geovindu
{
 
    /// <summary>
    ///
    /// </summary>
    /// <param name="buffer"></param>
    /// <param name="len"></param>
    /// <returns></returns>
    string to_utf8(const wchar_t* buffer, int len)
    {
        int nChars = ::WideCharToMultiByte(
            CP_UTF8,
            0,
            buffer,
            len,
            NULL,
            0,
            NULL,
            NULL);
        if (nChars == 0) return "";
        string newbuffer;
        newbuffer.resize(nChars);
        ::WideCharToMultiByte(
            CP_UTF8,
            0,
            buffer,
            len,
            const_cast<char*>(newbuffer.c_str()),
            nChars,
            NULL,
            NULL);
 
        return newbuffer;
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="str"></param>
    /// <returns></returns>
    string to_utf8(const wstring& str)
    {
        return to_utf8(str.c_str(), (int)str.size());
    }
    /// <summary>
    ///
    /// </summary>
    void createFile(wstring& strchinese)
    {
 
        ofstream testFile;
 
        testFile.open("demoinput.txt", std::ios::out | std::ios::binary);
 
        //std::wstring text = strchinese;          
 
        std::string outtext = to_utf8(strchinese);
 
        testFile << outtext;
 
        testFile.close();
 
    }
    ///<summary>
    /// 现有的文本写成UTF-8文本文件
    ///</summary>
    void Geovin::createFile()
    {
 
        ofstream testFile;
 
        testFile.open("geovindudemo.txt", std::ios::out | std::ios::binary);
 
        std::wstring text =
            L"涂聚文,你好,世界欢迎你!동생은 점수를 많이 땄어요\t geovindu\n Geovin Du \nНематериальное наследие водной рифмы\n"
            L"奇松・怪石・雲海と温泉\t大黄河を望む炳霊寺、驚異の張掖丹霞とシルクロードの要所9日間\n"
            L"Tours más solicitados\tParaíso en la Tierra - 13 Días\n"
            L"Entdecken Sie die schönsten Reiseziele von China mit unseren empfohlenen Touren.\n"
            L"Explorez les destinations les plus étonnantes de la Chine avec les visites recommandées.\n"
            L"\n";
 
        std::string outtext = to_utf8(text);
 
        testFile << outtext;
 
        testFile.close();
 
    }
 
};
 
#define UNICODE

// ConsoleTextFileDemoApp.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//geovindu Geovin Du
#define _UNICODE
#define _CRT_SECURE_NO_WARNINGS
 
 
#include <iostream>
#include <windows.h>
#include <string>
#include <string.h>
#include <fstream>
#include <stdio.h>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <codecvt>
#include <assert.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <io.h>
#include <vector>
 
#include "ConvertEncode.h"
#include "geovindu.h"
#include "FileHelper.h"
 
 
using namespace std;
using namespace geovindu;
 
 
 
 
 
/// <summary>
/// 写成UTF-8文本文件
/// </summary>
void createFile(wstring& strchinese)
{
    ConvertEncode encode;
    wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> convert;
 
    ofstream testFile;
 
    testFile.open("geovinduinput.txt", std::ios::out | std::ios::binary);
 
    //std::wstring text = strchinese;
 
 
    std::string outtext = convert.to_bytes(strchinese);//
 
    testFile << outtext;
 
    testFile.close();
 
    std::string narrowStr = convert.to_bytes(strchinese);
    {
        std::ofstream ofs("geovinduinput2.txt");            //文件是utf8编码
        ofs << narrowStr;
    }
 
}
/// <summary>
/// 读文写文件 utf-8的文本文件
/// </summary>
void readfile()
{
    ConvertEncode encode;
    char sname[50];
    string stuID;//学号
    int num;//编号
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    vector<string> lines;
    string line;
    ifstream fin;
    fin.open("geovinduinput.txt", ios::in); //utf-8文件读
    if (!fin)
    {
        cout << "Fail to open the file!" << endl;
        exit(0);
    }
 
    //创建链表,并保存数据
    while (1)
    {
        if (!(fin >> sname >> stuID >> english >> math >> cpp))//从文件中读取数据 中文没有读出来
        {
            break;
        }
        else
        {
            cout << encode.UTF8ToGBDu(sname) << "\t" << stuID << "\t" << english << "\t" << math << "\t" << cpp << endl;
        }
    }
 
    while (getline(fin, line)) {
        lines.push_back(line);
    }
    fin.close();
    //cout << encode.UTF8ToGBDu(sname) << "\t" << stuID << "\t" << english << "\t" << math << "\t" << cpp << endl;
     
}
 
 
const int FBLOCK_MAX_BYTES = 256;
/*
// File Type.
typedef enum FileType
{
    ANSI = 0,
    unicode,
    UTF8,
}FILETYPE;
 
FILETYPE GetTextFileType(const std::string& strFileName);
 
int UnicodeToANSI(char* pDes, const wchar_t* pSrc);
*/
 
int main(void)
{
    std::cout << "Hello World! 涂聚文\n";
 
     
 
 
 
 
    /*代码无用
            FileHelper helper;
            // file test.
            std::string strFileANSI = "studentANSI.txt";
            std::string strFileUNICODE = "student.txt";
            std::string strFileUTF8 = "geovindudemo.txt";
 
            // please change the file name to test.
            std::string strFileName = strFileUTF8;
            //文件类型没有读对
            TEXTFILETYPE fileType = helper.GetTextFileType(strFileName);
 
            if (TextFileType_UNICODE == fileType)
            {
                wchar_t szBuf[FBLOCK_MAX_BYTES];
                memset(szBuf, 0, sizeof(wchar_t) * FBLOCK_MAX_BYTES);
 
                std::string strMessage;
 
                FILE* fp = NULL;
                fp = fopen(strFileName.c_str(), "rb");
                if (fp != NULL)
                {
                    // Unicode file should offset wchar_t bits(2 byte) from start.
                    fseek(fp, sizeof(wchar_t), 0);
                    while (fread(szBuf, sizeof(wchar_t), FBLOCK_MAX_BYTES, fp) > 0)
                    {
                        char szTemp[FBLOCK_MAX_BYTES] = { 0 };
 
                        helper.UnicodeToANSI(szTemp, szBuf);
                        strMessage += szTemp;
                        memset(szBuf, 0, sizeof(wchar_t) * FBLOCK_MAX_BYTES);
                    }
                }
                cout << "UNICODE" << endl;
                std::cout << strMessage << std::endl;
 
                fclose(fp);
            }
            else if (TextFileType_UTF8 == fileType)
            {
                char szBuf[FBLOCK_MAX_BYTES];
                memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES);
 
                std::string strMessage;
 
                FILE* fp = NULL;
                fp = fopen(strFileName.c_str(), "rb");
                if (fp != NULL)
                {
                    // UTF-8 file should offset 3 byte from start position.
                    fseek(fp, sizeof(char) * 3, 0);
                    while (fread(szBuf, sizeof(char), FBLOCK_MAX_BYTES, fp) > 0)
                    {
                        strMessage += szBuf;
                        memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES);
                    }
                }
                cout << "utf-8" << endl;
                std::cout << strMessage << std::endl;
 
                fclose(fp);
            }
            else
            {
                char szBuf[FBLOCK_MAX_BYTES];
                memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES);
 
                std::string strMessage;
 
                FILE* fp = NULL;
                fp = fopen(strFileName.c_str(), "rb");
                if (fp != NULL)
                {
                    // common file do not offset.
                    while (fread(szBuf, sizeof(char), FBLOCK_MAX_BYTES, fp) > 0)
                    {
                        strMessage += szBuf;
                        memset(szBuf, 0, sizeof(char) * FBLOCK_MAX_BYTES);
                    }
                }
                cout << "ANSI" << endl;
                std::cout << strMessage << std::endl;
 
                fclose(fp);
 
 
            }
 
 
    */
 
 
 
 
    readfile();
    //读内容
    //std::wstring_convert<std::codecvt_utf8<wchar_t>> conv;
    //std::ifstream ifs(L"geovinduinput.txt");
    //while (!ifs.eof())
    //{
    //  string line;
    //  getline(ifs, line);
    //  wstring wb = conv.from_bytes(line);
    //  wcout.imbue(locale("chs"));         //更改区域设置 只为控制台输出显示 其他语言显示不了,中文可以
    //  wcout << wb << endl;
    //}
    //ifs.close();
 
 
    Geovin geovin;
    geovin.createFile();
    wstring allstr;
    wstring sname;
    wstring stuID;//学号
    int num;//编号
    double english;//英语成绩
    double math;//数学成绩
    double cpp;//C++成绩
    int location = 0;//位置编号
    int flag = 0;//标记是否有对应的编号
 
    wcout << "请输入新增学生的信息" << endl;
    wcout << "姓名\t" << "学号\t" << "英语\t" << "数学\t" << "C++\t" << endl;
    wcin.imbue(locale("chs"));//获取的是中文
    
    wcin >> sname >> stuID >> english >> math >> cpp;
 
    //allstr = sname + ' ' + stuID;
    allstr.append(sname); //C++ wstring::append
    allstr.append(L"\t");
    allstr.append(stuID);
    allstr.append(L"\t");
    allstr.append(to_wstring(english));
    allstr.append(L"\t");
    allstr.append(to_wstring(math));
    allstr.append(L"\t");
    allstr.append(to_wstring(cpp));
   // createFile(allstr);
 
 
    system("pause");
    return 0;
 
 
}
 
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
 
// 入门使用技巧:
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
 
 
 
 
 
#define UNICODE

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/478621.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】如何创建进程?

&#x1f525;&#x1f525; 欢迎来到小林的博客&#xff01;&#xff01;       &#x1f6f0;️博客主页&#xff1a;✈️林 子       &#x1f6f0;️博客专栏&#xff1a;✈️ 小林的Linux之路       &#x1f6f0;️社区 :✈️ 进步学堂       &a…

【技术】《Netty》从零开始学netty源码(四十八)之缓存池ObjectPool

目录 ObjectPool创建对象池获取对象get()从本地池中获取对象claim()回收对象 ObjectPool 在分析PooledByteBuf的时候我们遇到了recycleHandler类&#xff0c;该类用于回收已经使用完毕的缓存对象并将其放回池中供下次循环利用&#xff0c;Netty的对象池工作过程大体如下&#…

数字图像处理简答题

目录 1.人类视觉对颜色的主观感觉包括哪三类&#xff1f; 2. 图像成像的过程包括哪三步&#xff1f; 3.图像的采样和量化分别指什么&#xff1f; 4、取k8时&#xff0c;将下图用相应矩阵表示 5、简述当限定了数字图像的数据量时采样和量化参数的选择遵循哪两条原则&#x…

荔枝派Zero(全志V3S)制作 IMG 镜像文件

文章目录 前言一、安装工具二、生成新的 img 文件三、分割虚拟磁盘四、挂载虚拟磁盘并格式化1、首先建立虚拟磁盘并分区2、格式化虚拟磁盘分区 五、开始备份六、卸载虚拟磁盘七、dd 烧录系统八、运行测试 前言 之前在玩板子时每次烧录镜像都是先烧录 uboot 到 SD 卡 8k 偏移处…

03 DQL-表数据的查询

1.数据准备(直接复制执行即可) -- 创建db1数据库 CREATE DATABASE db1;-- 使用db1数据库 USE db1;-- 创建数据表 CREATE TABLE product(id INT, -- 商品编号NAME VARCHAR(20), -- 商品名称price DOUBLE, -- 商品价格brand VARCHAR(10), -- 商品品牌stock INT, -- 商品库存…

【场景削减】基于 Kantorovich 距离的 SBR 算法场景削减研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SpringCloud:微服务保护之雪崩问题及解决方案

1.雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个微服务往往依赖于多个其它微服务。 如图&#xff0c;如果服务提供者I发生了故障&#xff0c;当前的应用的部分业务因为依赖于服务I&#xff0c;因此也会被阻塞。此时&#xff0c;其它不依赖于服务I的业…

Redis学习笔记01 (数据结构,线程模型,持久化)

Background Redis&#xff08;Remote Dictionary Server&#xff09;是一种基于键值对的内存数据库&#xff0c;通常被称为数据结构服务器。它支持多种数据结构&#xff0c;例如字符串&#xff08;String&#xff09;、哈希&#xff08;Hash&#xff09;、列表&#xff08;Li…

17 图的遍历和应用

文章目录 图的遍历深度优先遍历对于无向图的邻接矩阵的深度优先遍历无向非连通图的深度优先遍历 对于无向图的邻接表的深度优先遍历非递归实现深度优先遍历无向图的邻接矩阵代码实现无向图的邻接表代码实现递归和非递归的同异 广度优先遍历邻接表BFS邻接矩阵BFS 图的应用生成树…

计算机组成原理指令系统习题

(1)解析&#xff1a;考察指令的格式&#xff1a;指令码包含地址码和操作码 寻址特征位包含在操作码中 用于区分不同的寻址方式。 首先确定6种寻址方式 根据2^3>6得出三位寻址地址位&#xff0c;再根据能完成97种操作&#xff0c;所以OP的位数是7位&#xff08;128&#xff0…

【论文代码阅读】LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS

最近很多工作好像都绕不开lora&#xff0c;无论是sd还是llm.... 1. 背景 问题&#xff1a;大模型重新训练所有模型参数的完全微调变得不太可行。lora在做什么 我们提出了低秩自适应&#xff0c;即LoRA&#xff0c;它冻结预先训练的模型权重&#xff0c;并将可训练的秩分解矩…

【数字图像处理简答题】

目录 1.邻域和邻接有何区别&#xff1f; 2. m邻接的定义是什么&#xff1f;为何要引入m邻接&#xff1f; 3、下图的连通域个数&#xff1f;分别是什么&#xff08;使用8连通&#xff09; 4、像素间的距离测度有哪四种&#xff0c;写出其表达式并绘制几何示意图。 5、图像间…

算法套路十三——动态规划DP入门

算法套路十三——动态规划DP入门 动态规划和递归都是通过将大问题分解为较小的子问题来解决问题。它们都可以用来解决具有重叠子问题和最优子结构特性的问题。在很多情况下&#xff0c;动态规划算法的设计可以从递归算法开始&#xff0c;然后通过添加记忆化&#xff08;Memoiz…

什么是SpringBoot自动配置

概述&#xff1a; 现在的Java面试基本都会问到你知道什么是Springboot的自动配置。为什么面试官要问这样的问题&#xff0c;主要是在于看你有没有对Springboot的原理有没有深入的了解&#xff0c;有没有看过Springboot的源码&#xff0c;这是区别普通程序员与高级程序员最好的…

【五一创作】网络协议与攻击模拟-01-wireshark使用-捕获过滤器

协议 TCP/IP协议簇 网络接口层(没有特定的协议)PPPOE 物理层 数据链路层 网络层:IP (v4/v6) ARP (地址解析协议) RARP ICMP (Internet控制报文协议) IGMP 传输层:TCP(传输控制协议) UDP(用户数据报协议) 应用层:都是基于传输层协议的端口,总共端口0~65535 0~1023 HTTP—t…

2023年第十五届华中杯数学建模赛题浅析

2023年五一假期期间&#xff0c;数学建模竞赛就有四场&#xff0c;各种比赛各种需求应接不暇。因此&#xff0c;对于本次浅析有不足的地方欢迎大家指出。为了更好的帮助大家华中杯选题&#xff0c;首先为大家带来ABC三个题目的浅析&#xff0c;帮助大家更快的选题&#xff0c;提…

DBeaver 没有菜单项 生成SQL Generate SQL

文章目录 Intro问题的根本有无该菜单项取决于你的查询SQL是单表还是多表&#xff1f;单表查询的结果集的菜单多表关联查询的结果集的菜单 测试版本 Intro DBeaver 是一款很棒的多平台、支持多数据源的GUI数据库客户端。 有一个我经常使用的功能就是&#xff1a; 当我查询到一个…

BUUCTF bjdctf_2020_babystack

小白做题笔记而已&#xff0c;不建议阅读 只有一个NX 64为程序用rdi传参 read函数存在栈溢出 shift f12 有system函数调用&#xff0c;并且存在/bin/sh 去找有没有pop rdi ret ROPgadget --binary bjdctf_2020_babystack --only "pop|ret" | grep rdi 0…

『Linux』第九讲:Linux多线程详解(二)_ 线程控制

「前言」文章是关于Linux多线程方面的知识&#xff0c;上一篇是 Linux多线程详解&#xff08;一&#xff09;&#xff0c;今天这篇是 Linux多线程详解&#xff08;二&#xff09;&#xff0c;讲解会比较细&#xff0c;下面开始&#xff01; 「归属专栏」Linux系统编程 「笔者」…

「OceanBase 4.1 体验」|连续多年支撑双11的国产原生分布式数据库

目录 前言 正文 1. OceanBase 4.1发布 2.部署oceanbase 安装环境 2.1下载 all-in-one 安装包 2.2解压安装包 2.3执行安装脚本 2.4设置环境变量 2.5查看文件位置 2.6快速启动demo环境 2.7访问数据库 3.oceanbase的优点 4.oceanbase与 Oracle 兼容性 5.oceanbase与…