vc6.0:中文字串的读取

#include
#include
#include
#include
using namespace std;

int main(){
locale china("chs");
wcin.imbue(china);                            //use locale object
wcout.imbue(china);
wstring title;
wchar_t wc = L'。';
while(getline(wcin, title, wc)){
size_t len = title.length();                //size_t可以换成int
size_t i, j;
for(i=0; i
for(j=i+1; j<=len; j++){
wstring keyword = title.substr(i, j-i);
// cout << "keyword=\'" << keyword << "\'" << endl;
wcout << keyword << endl;
}
}
}
}

在vc6中,一个中文字符占两个字节,当给定一个中文字符串时,如何输出其所有子串?

1.其循环算法不是大问题,可以这样写:

#include
#include
#include
#include
using namespace std;

int main(){
string title;
int i, j;
while(cin >> title){
int len = title.length();
for(i=0; i
for(j=i+1; j<=len; j++){
string keyword = title.substr(i, j-i);
cout << "keyword=\'" << keyword << "\'" << endl;
}
}
}
return 0;
}

但是要处理的是中文字符,如果每次考虑读取两个字符,那么一旦是中英文混合输入,就有一些子串取不到,而且中文子串只输出一个char的时候是乱码,每个中文字对应的连续两个char连续输出时才不是乱码。

解决方法是用wstring。sample程序如下:

详细的sample解释程序,可以看这里:http://stackoverflow.com/questions/402283/stdwstring-vs-stdstring

以及这里:http://www.cnblogs.com/xiaoyz/archive/2008/10/11/1308860.html

 

在做LMS的时候需要处理一些从文件读入的数据:书名、作者、出版社等,当中含有中文字段,需要用wstring处理。

现在,图书或读者信息存储在txt文件中,如何操作?

在sjtu的一个页面上发现了一个解决方案:

  • 传统的string只能应用于有限的西文字符,由于图书馆的信息中包含中文字符,所以我们需要引入wstring。
  • 我们从外部文件读入数据,采用原始的string读入,然后再相应转换为wstring。
  • 相应的,当我们将数据写入外部文件时,先将wstring转换为string,然后写入。
  • 对于Windows用户,请在程序头include windows.h。

页面的连接地址是:http://acm.sjtu.edu.cn/courses/cs110/fa11/lib-tutorial/section5/sandw/

我认为上面有小错误,做了修改,得到两个正确的函数。为了说明问题,这里举一个sample程序:

#include
#include
#include
#include
#include
#include
#include
using namespace std;

inline string wtos(const wstring&w)
{
    int len= WideCharToMultiByte(GetACP(),0,w.c_str(),-1,NULL,0,NULL,NULL);
    char *buf= new char[len];
    WideCharToMultiByte(GetACP(),0,w.c_str(),-1,buf,len,NULL,NULL);
    string s(buf);
    delete[] buf;
    return s;
}

inline wstring stow(const string &s)
{
    int len= MultiByteToWideChar(GetACP(),0,s.c_str(),-1,NULL,0);
    wchar_t*buf= new wchar_t[len];
    MultiByteToWideChar(GetACP(),0,s.c_str(),-1,buf,len);
    wstring w(buf);
    delete[] buf;
    return w;
}

int main(){
locale china("chs");
wcin.imbue(china);//use locale object
wcout.imbue(china);
ifstream fin("chris.txt");
string title;
wstring ret;
while(getline(fin, title)){
istringstream sin(title);
wstring ret;
while(sin >> title){
ret = stow(title);
wcout << L"ret = " << ret << endl;
}
}
}

chirs.txt文件的内容:

算 法   导论abc

输出截屏:

sample中,从文件中读入整行的string,然后用istringstream的方法读入每一个小的string,读入后再用stow()转化之,这样就可以使用了!!

时间: 2024-10-25 19:32:09

vc6.0:中文字串的读取的相关文章

windows下 vc6.0中使用speex库压缩音频文件

问题描述 windows下 vc6.0中使用speex库压缩音频文件 想在windows下使用speex库压缩音频文件 代码使用speex文档中附录A的代码 只是把其中的文件路径修改了 但是编码之后的文件大小只用2K 原文件900K左右,而且解码后无法播放,全是杂音,请问是怎么回事 编码文件是PCM格式的. 代码如下 #include #include #include #include #define FRAME_SIZE 160 void main() { FILE *fin,*fout;

vc6 0 extern 问题2个-vc6.0 中extern使用时遇到的2个疑问,还望诸位帮忙看下,多谢

问题描述 vc6.0 中extern使用时遇到的2个疑问,还望诸位帮忙看下,多谢 我在文件1CTestHello.cpp 声明了 extern void delete_string(char a[],char b[],char standard); 再调用文件2 file2.c中的delete_string(a,b,Standard);函数: 发现2个问题: 问题1:用extern实验发现必须用include,但查找资料,没有说这两个有必然关联.请问到底有没有必然关联?下面是实验: 如果文件1中

指令-VC6.0中dll创建失败,编译报错怎么处理

问题描述 VC6.0中dll创建失败,编译报错怎么处理 VC6.0环境,创建DCOM的服务器. 想要生成一个dll文件,在project setting里面输入了指令 然后就出现了编译错误 这个怎么破?求各位大神解答! 解决方案 -f是参数吧,中间缺少空格. 解决方案二: nmake命令路径是否正确,是否PATH环境变量中.跟参数之间要有空格.

c++-vc6.0中如何编译和执行由多个C++源文件组成的程序

问题描述 vc6.0中如何编译和执行由多个C++源文件组成的程序 程序分成几个不同部分的源文件,怎么导入一个工程中,新手求编译执行的步骤 解决方案 新建一个项目,然后在文件菜单添加源代码,把代码复制过来. 这些源代码本身要匹配. 如果要使用外部的函数,用extern声明. 如果代码没有问题,就可以编译. 解决方案二: 先在vc里建立一个 win32的控制台工程 然后将你的文件导入就应该可以了 解决方案三: 创建一个空项目,在"源文件"里面添加.cpp的文件,在"头文件&quo

坐标绘制-VC6.0 中 图形和坐标的绘制的简单问题,求救!!

问题描述 VC6.0 中 图形和坐标的绘制的简单问题,求救!! VC 6.0 中直接在单文档应用程序的View类视图上给绘制坐标轴应该在哪个函数里进行?并且要完成坐标和图形的重绘应该在哪个函数里进行??或者讲述一下OnDraw().OnPaint().OnInitialUpdate().OnEraseBkgnd(pDC)这几个函数的作用和在MFC中的调用顺序吧! 谢谢啦,不胜感激了!!! 解决方案 单文档应用程序的绘图是在OnDraw中完成的,把绘图的动作放在OnDraw中,把坐标计算可以放在外

c++ 单链表-单链表做电话本 在VC6.0中运行不了?

问题描述 单链表做电话本 在VC6.0中运行不了? /*用单链表的形式做成的电话本:功能:插入成员,删除成员,修改成员,搜索成员,输出整个链表*/ #include #include using namespace std; struct tel{ int number; char name[20]; tel *next;}; /*print the whole line*/ tel print(tel*head){ tel*p=new tel; p=head; while(p->next!=N

为什么VC6.0中编译的mpi可执行文件,在MPICH运行时,到printf(“*“)时输出不了*

问题描述 为什么VC6.0中编译的mpi可执行文件,在MPICH运行时,到printf("*")时输出不了* 我看到有的MPI程序用的是fprintf,如 fprintf(stderr,"Process %d on %sn",myid, processor_name); fflush(stderr); 这个是什么?一定要用这个吗?不是吧,我看到有的MPI程序用printf也可以,这是为什么???该怎么办啊 解决方案 这是输出到stderr管道,printf是输出到s

c语言问题-大家好,下面这段程序在vc6.0中编译时没错误,但却运行不起来。麻烦帮看一下

问题描述 大家好,下面这段程序在vc6.0中编译时没错误,但却运行不起来.麻烦帮看一下 #include #include int main() { int shu,shang,i,yushu; int a[16]={0}; clrscr(); printf("shu ru yi ge shu shi jin zhin "); scanf("%d",shu); for(i=0;i { yushu=shu%2; shang=shu/2; a[i]=yushu; shu

快速掌握VC6.0中各种宏注释应用(附图)_C 语言

为了方便别人或自己阅读自己的程序,注释是坚决不可少的.一个漂亮的程序,不是在于你应用的技术多么高深,而是能够把高深的技术描述的清楚易懂. 在Java的IDE环境--Eclispe中,有很多中注释的,并且设置注释也是很方便的,因为现在从事C++,嘻嘻,Eclispe已经卸载,至于设置注释的地方,直接百度或谷歌即可. 所以嘛,习惯了Eclispe的注释,所以想法设法,在VC6.0中尝试.当对于一个陌生的东西而言,如何熟悉他呢,就是拿你现在已有的知识,去联想.比如Java中截取字符串,或解析xml等,