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
哲学管理(学)人生, 文学艺术生活, 自动(计算机学)物理(学)工作, 生物(学)化学逆境, 历史(学)测绘(学)时间, 经济(学)数学金钱(理财), 心理(学)医学情绪, 诗词美容情感, 美学建筑(学)家园, 解构建构(分析)整合学习, 智商情商(IQ、EQ)运筹(学)成功.---Geovin Du(涂聚文)
我输入了 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++ --help
或man 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.c
和 make
:-) 显然,您仍然必须在 第一次 时间(在配置构建系统时)将其做好,但是一旦完成,您通常不需要再次担心它。以上是关于cpp: 因控制台65001,936 中文输入问题的主要内容,如果未能解决你的问题,请参考以下文章
CMD的代码页被默认设置成了65001,每次运行都要输一次chcp936,如何永久修改呢?
LookupError: unknown encoding: cp65001的问题