C++ファイルの中の漢字を読み取って、wifstream、wstringの使用

6791 ワード

最近のプロジェクトは画像に漢字を書く必要があり、opencv、freetypeで実現したが、Linuxの下で開発するには多くの問題が発生し、特にPuttext関数が連続した漢字を書くときに文字化けしてしまうことも、私を苦しめていることを記録した.
なぜ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に関する資料は非常に少なく、長い間探して、長い間試してみて予想された機能に達して、記録して、後で使うときに便利に調べることを望んでいます.