cpp: 因控制台65001,936 中文输入问题

Posted ®Geovin Du Dream Park™

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cpp: 因控制台65001,936 中文输入问题相关的知识,希望对你有一定的参考价值。

 

 

 

 

// 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;
	string sname;
	string stuID;//学号
	int num;//编号
	double english;//英语成绩
	double math;//数学成绩
	double cpp;//C++成绩
	vector<string> lines;
	string line;
	
	ifstream fin;
	fin.open("student.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.c_str()) << "\\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)



	//控制器是936,程序文件是utf-8,用这个 只是COUT显示正常 输入获取不了值
	setlocale(LC_ALL, "zh_CN.UTF-8");
	//加另一设置,都显示正常,就是获取输入中文值问题
	//system("CHCP 65001");
	//system("CHCP 936");
	//cout.imbue(locale("zh_CN.utf8"));
    wcout << L"Hello World! 涂聚文\\n";
	wstring dsname;
	wcin >> dsname;
	wcout << L"cin:" << dsname << endl;
	

	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 stuID;
	int num;//编号
	double english;//英语成绩
	double math;//数学成绩
	double cpp;//C++成绩
	int location = 0;//位置编号
	int flag = 0;//标记是否有对应的编号
	wcout.imbue(locale("zh_CN.UTF-8"));
	wcout << L"请输入新增学生的信息" << endl;
	wcout << L"姓名\\t" << L"学号\\t" << L"英语\\t" << L"数学\\t" << L"C++\\t" << endl;
	//wcin.imbue(locale("zh_CN.UTF-8"));//获取的不是中文
	wcin.imbue(locale("chs"));
    wcin >> sname >> stuID >> english >> math >> cpp;  //但获不到值

	//allstr = sname + \' \' + stuID;
	allstr.append(sname); //C++ wstring::append
	allstr.append(L" ");
	allstr.append(to_wstring(stuID));
	allstr.append(L" ");
	allstr.append(to_wstring(english));
	allstr.append(L" ");
	allstr.append(to_wstring(math));
	allstr.append(L" ");
	allstr.append(to_wstring(cpp));
    createFile(allstr);


	system("pause");
	return 0;




// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件





#define UNICODE

  

我输入了 g++ -o main.cpp main 并且我丢失了我的程序 [关闭]

【中文标题】我输入了 g++ -o main.cpp main 并且我丢失了我的程序 [关闭]【英文标题】:I typed g++ -o main.cpp main and I lost my program [closed] 【发布时间】:2018-11-25 22:51:46 【问题描述】:

我刚刚在控制台中写入了以下内容:

g++ -o main.cpp main

我的main.cpp 不见了。

我刚刚失去了 3 个小时的工作吗?

【问题讨论】:

试试g++ --helpman g++ 一句话,“是的”。从中学到什么 - 使用 git 或 mercurial 等版本控制系统,并在您编写的每几条语句中提交它。 你了解过cmd文件吗?也许您的第一个 cmd 文件可能总是会制作备份副本。然后当你看到你的 cmd 错误时......有一天,你会想尝试 make,它的学习曲线更陡峭。第 1 步 - 输入一个可执行的 cmd 文件(可能是 build?),它运行 g++ 命令来编译 helloWorld.cpp。如果它在不覆盖您的输入的情况下工作,请继续执行第 2 步。 【参考方案1】:

是的,你做到了。 -o 标志指定输出文件(在您的情况下为main.cpp,因为这是紧随其后的文件名):

g++ -o main.cpp main
    \_________/ \__/
              \    \_This is the input file.
               \_____This specifies the output file.

换句话说,您已经告诉编译器尝试编译通常是您的可执行文件,并将结果写入您的源文件(覆盖它)。更合适的命令是:

g++ -o main main.cpp

这是开发人员不时经历的那些教育时刻之一(包括像我这样的老黑客),应该说服你定期提交到 git(或其他源代码控制系统),或使用构建系统而不是复杂的命令行来编译代码。

【讨论】:

我明白这里发生了什么 - 我不明白你的解释。 还有为什么不手动输入命令,而是将它们放在 makefile 或其他构建脚本中。 @o11c:命令越复杂,出错的可能性就越大。对比 gcc -std=c11 -O2 -funsigned-bitfields -fallow-single-precision -fgimple -c -o prog.o prog.cmake :-) 显然,您仍然必须在 第一次 时间(在配置构建系统时)将其做好,但是一旦完成,您通常不需要再次担心它。

以上是关于cpp: 因控制台65001,936 中文输入问题的主要内容,如果未能解决你的问题,请参考以下文章

cmd 控制台中文乱码 解决方案

CMD的代码页被默认设置成了65001,每次运行都要输一次chcp936,如何永久修改呢?

LookupError: unknown encoding: cp65001的问题

LookupError: unknown encoding: cp65001

sqlite的控制台中文显示问题

前端格式