c++读入之 -- 汉字读入遇到的问题

好吧,课题和汉语处理有关,于是就要求用c++来读入汉字进行处理。

首先使用wchar_t字符即宽字符,然后这样定义:

 1 #include <cstdio>
 2 #include <cwchar>
 3
 4 using namespace std;
 5
 6 int main() {
 7     wchar_t* ch;
 8     scanf("%S", ch);
 9     printf("%S", ch);
10     return 0;
11 }

然后结果是什么呢?没输出、、、

于是我们改一改:

 1 #include <cstdio>
 2 #include <cwchar>
 3
 4 using namespace std;
 5
 6 int main() {
 7     wchar_t ch;
 8     ch = getwchar();
 9     printf("%C", ch);
10     return 0;
11 }

还是没有输出。我试着改成了"printf("%d", ch);",于是输出了-1

这表明,即使是宽字符,也是按照char的宽度读进去的,也即,wchar_t是一个至少到现在没什么大用处的字符类型?

怎么办呢?czr大爷告诉我其实可以这样写:

 1 #include <iostream>
 2 #include <string>
 3
 4 using namespace std;
 5
 6 int main() {
 7     string st;
 8     cin >> st;
 9     cout << st << endl;
10     return 0;
11 }

string类里实现了写高端的东西,反正就是可以读入输出中文。

然后我表示不爽。。因为cin、cout太慢了,于是我们想到了一些奇怪的东西:

 1 #include <cstdio>
 2 #include <iostream>
 3 #include <string>
 4
 5 using namespace std;
 6
 7 int main() {
 8     ios::sync_with_stdio(false);
 9     string st;
10     cin >> st;
11     cout << st << endl;
12     return 0;
13 }

上面程序的line 8是新加上去的一句话,"std::ios::sync_with_stdio(false);",只要这句话,cin就和scanf的速度相差无几了。
"cin慢是有原因的,其实默认的时候,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。正因为这个兼容性的特性,导致cin有许多额外的开销,如何禁用这个特性呢?只需一个语句std::ios::sync_with_stdio(false);,这样就可以取消cin于stdin的同步了。" -- by byvoid

于是用c++读入中文这件破事终于是搞定了。顺带一提,表示从来用char*的窝又要去学过度封装的string类的操作了2333

时间: 2024-10-07 05:16:13

c++读入之 -- 汉字读入遇到的问题的相关文章

R语言︱文件读入、读出一些方法罗列(批量xlsx文件、数据库、文本txt、文件夹)

笔者寄语:小规模的读取数据的方法较为简单并且多样,但是,批量读取目前看到有以下几种方法:xlsx包.RODBC包.批量转化成csv后读入. R语言中还有一些其他较为普遍的读入,比如代码包,R文件,工作空间等. source  #读取R代码dget    #读取R文件load    #读取工作空间 -------------------------------- SPSS-STATA格式的读入包--foreign 读取其他软件的格式foreigninstall.packages("foreign&

读入优化&amp;输出优化

读入优化:读入优化只是针对整数,由于getchar()读字符非常的快,所以采用getchar()来进行读入,下设输入的数为x 负数处理:用一个标志变量f,开始时为1,当读入了'-'时,f变为-1,最后x*=f即可 绝对值部分处理:getchar()每次只能读一位,所以每当读了一位s时,x*=10,为s留位置,由于s为字符,需要减去'0'才能转为整数即:x=x*10+s-'0' 关于细节: 很多时候有多余的空格或者其它的一些无关字符输入,处理时需要注意排除 代码: 1 void read(int

c++中文件最后一个字符不能读入问题的解决

在做一个实验的时候,需要将文件中的数据逐行读入,在读入的时候遇到了一个问题,前面几行的数据读入正常,最后一行数据的读入会少一个数据,数据格式如下 注意箭头处,这里是文件的末尾了,前面的数据之后都跟了一个换行符,最后一行数据没有换行就直接结束了. 我之前的做法是 while (!feof(fin)) { if (fgets(word, 64, fin) == NULL) break; word[strlen(word) - 1] = '\0'; ...... 代码并不完整,但是已经能够说明问题了,

Java IO详解

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:618528494  我们一起学Java! 初学Java,一直搞不懂Java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是Java io 比较基本的一些处理流

Java IO流详解

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

Java与编码问题串讲之二–如何理解java采用Unicode编码

Java开发者必须牢记:在Java中字符仅以一种形式存在,那就是Unicode(不选择任何特定的编码,直接使用他们在字符集中的编号,这是统一的唯一方法).由于java采用unicode编码,char 在java中占2个字节.2个字节(16位)来表示一个字符. 这里的Java中是指在JVM中.在内存中.在代码里声明的每一个char.String类型的变量中. 例如: 1 2 3 4 5 6 7 System.out.println(System.getProperty("file.encoding

Java IO最详解

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

OCR技术浅探:特征提取(1)

作为OCR系统的第一步,特征提取是希望找出图像中候选的文字区域特征,以便我们在第二步 进行文字定位和第三步进行识别.在这部分内容中,我们集中精力模仿肉眼对图像与汉字的处理过程,在图像的处理和汉字的定位方面走了一条创新的道路.这部分工作是整个OCR系统最核心的部分,也是我们工作中最核心的部分. 传统的文本分割思路大多数是"边缘检测 + 腐蚀膨胀 + 联通区域检测",如论文[1]. 然而,在复杂背景的图像下进行边缘检测会导致背景部分的边缘过多(即噪音增加),同时文字部分的边缘 信息则容易被

关于JAVA IO流的学习

初学Java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa