C++ファイルの中の漢字を読み取って、wifstream、wstringの使用
最近のプロジェクトは画像に漢字を書く必要があり、opencv、freetypeで実現したが、Linuxの下で開発するには多くの問題が発生し、特にPuttext関数が連続した漢字を書くときに文字化けしてしまうことも、私を苦しめていることを記録した.
なぜwifstreamを使うのですか?ファイル中は漢字で2バイトを占めているので、ifstreamだけで読み取ればPutText(const char*)という関数の場合、漢字は正常に表示されないのでPutText(const wchar_t*)という関数しか使えなくなり、大量の実験でいろいろな方法を試して、最終的に文字化けの問題を解決しました.
本題に戻り、ファイルの漢字の読み方を直接見て、wstringで表すと、wstringがあります.data()はconst wcharを得るt*タイプです.
コードが通じると簡単な感じがしますが、ネット上のwstringに関する資料は非常に少なく、長い間探して、長い間試してみて予想された機能に達して、記録して、後で使うときに便利に調べることを望んでいます.
なぜwifstreamを使うのですか?ファイル中は漢字で2バイトを占めているので、ifstreamだけで読み取ればPutText(const char*)という関数の場合、漢字は正常に表示されないのでPutText(const wchar_t*)という関数しか使えなくなり、大量の実験でいろいろな方法を試して、最終的に文字化けの問題を解決しました.
本題に戻り、ファイルの漢字の読み方を直接見て、wstringで表すと、wstringがあります.data()はconst wcharを得るt*タイプです.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "normal.h"
#include
#include "lib/CvxText.h"
#include
using namespace std;
int main(){
// ,
Mat src = imread("drivelicense1.jpg");
if(src.data == NULL){
cout<<"read image error"<return 0;
}
Mat src1 = src.clone();
CvxText chinese_text("/font/aa.ttf");
CvScalar fsize = cvScalar(38,0.05,0.15,0);
float p = 0.6;
chinese_text.setFont(NULL,&fsize,NULL,&p);
CvScalar color = CV_RGB(0,0,0);
IplImage ipl(src1);
// ,
locale china("zh_CN.UTF-8");
wifstream infile;
// , ,
infile.open("../meta/roads_line.txt");
if(!infile.is_open()){
cout<<"fail to open the file"<return 0;
}
infile.imbue(china);
int i=0;
wstring value;
while(!infile.eof()){
infile >> value; // , wstring
//opencv chinese_text.putText(&ipl,value.data(),cvPoint(30*i,45*i),color);
char coor[256];
sprintf(coor,"%d",i);
imwrite("meta/desimage"+string(coor)+".jpg",src1);
wcout<// value
}
if (infile.eof()) {
cout<<"End of file reached!"<else if (infile.fail()){
cout<<"Input terminated by data mismatched!"<else{
cout<<"Input terminated for unknown reason!"<return 0;
}
#
#include
#include
#include
#include
using namespace std;
int main(){
// ,
locale china("zh_CN.UTF-8");
wifstream infile;
// , ,
infile.open("../meta/roads_line.txt");
if(!infile.is_open()){
cout<<"fail to open the file"<return 0;
}
infile.imbue(china);
wstring value;
while(!infile.eof()){
infile >> value; // , wstring
wcout<// value
}
if (infile.eof()) {
cout<<"End of file reached!"<else if (infile.fail()){
cout<<"Input terminated by data mismatched!"<else{
cout<<"Input terminated for unknown reason!"<return 0;
}
コードが通じると簡単な感じがしますが、ネット上のwstringに関する資料は非常に少なく、長い間探して、長い間試してみて予想された機能に達して、記録して、後で使うときに便利に調べることを望んでいます.