2011-01-06 15 views
0

すべての行の先頭に<item>を追加し、すべての行の末尾に</item >を追加するはずのC++プロジェクトがあります。これは正常な英語のテキストでうまく動作しますが、私はこれをやりたい中国語のテキストファイルを持っていますが、動作しません。私は通常.txtファイルを使用しますが、このためには.rtfを使用して中国語のテキストを保存する必要があります。私のコードを実行した後、それは不器用になります。ここに例があります。C++テキストファイル、中国語

{\ RTF1 \ adeflang1025 \ ANSI \ ansicpg1252 \ UC1 \ adeff31507 \ deff0 \ stshfdbch31506 \ stshfloch31506 \ stshfhich31506 \ stshfbi31507 \ deflang1033 \ deflangfe1033 \ themelang1033 \ themelangfe0 \ themelangcs0 {\ fonttbl {\ F2 \ fbidi \ fmodern \ fcharset0の\のfprq1クーリエ 新しい{* \ 02070309020205020404パノース};}

コード:

int main() 
{ 
    ifstream in; 
    ofstream out; 
    string lineT, newlineT; 

    in.open("rawquote.rtf"); 
    if(in.fail()) 
     exit(1); 
    out.open("itemisedQuote.rtf"); 
    do 
    { 
     getline(in,lineT,'\n'); 
     newlineT += "<item>"; 
     newlineT += lineT; 
     newlineT += "</item>"; 
     if (lineT.length() >5) 
     { 
      out<<newlineT<<'\n'; 
     } 
     newlineT = ""; 
     lineT = ""; 
    } while(!in.eof()); 
    return 0; 
} 
+0

rawquote.rtf入力ファイルをテキストのみのモードで表示し、実際に何が含まれているかを確認します。 – aschepler

+0

バックスティックを使用して次のようにコードをエスケープします: '' '' –

+0

RTF要件は顧客からのものか、プレーンテキスト文書で問題があったための独自の要件ですか?正しいエンコードを使用している限り、漢字をテキスト文書に出力することはできません。 –

答えて

1

RTFのように見えます、なりますこれはrtfファイルだと言っても意味がありません。

あなたが開いたときに基本的に、あなたがそのファイルをダンプた場合、あなたはそれがそのように見える参照してくださいよ...

また、あなたは "私はあなたが使うべきだと思う

std::string line; 
while(getline(in, line, '\n')) 
{ 
    // do stuff here, the above check correctly that you have indeed read in a line! 
    out << "<item>" << line << "</item>" << endl; 
} 
0

あなたのループを再検討すべきです文字列の代わりに 'regular char'の代わりにwchar 'を使用します。

+0

wcharではなくwchar_tを意味すると思いますが、これは役に立たないでしょう。 –

1

フォーマットタグなどを無視するだけで、コードを破損する可能性があるため、プレーンテキストと同じ方法でRTFコードを読み取ることはできません。

中国語のテキストをUTF-8(BOMなし)を使用してテキストファイルとして保存すると、コードが機能するはずです。しかし、他のUTF-8でエンコードされた文字の中に本質的に改行が含まれている場合(この部分についてはまだ分かりません)、実際のUTF-8変換を試み、通常の文字の代わりにワイド文字を使用してファイルを読みとるべきですChanが示唆したように)、これはC++を使ってややこしいことです。

+0

UTF-8でエンコードされた文字は、それが正確な文字でない限り、ASCII文字を含むことはできません。 ASCIIは7ビットのエンコーディングであり、常に8番目のビットが設定されていないことを覚えておいてください。 UTF-8のASCII以外の文字は常に、最初のバイトと継続バイトに8番目のビットが設定されています。このプロパティは、UTF-8を魅力的にするものの1つで、UTF-16などの他のエンコーディングでは当てはまりません。 –

+0

ファイルがUTF-8(非標準の "UTF-8 BOM"の有無にかかわらず)の場合、ファイル処理(!eof)を修正するだけでこのコードを動作させることができます。 –

0

このコードの目的を理解していれば、あなたのソリューションはうまくいきません。 RTFドキュメントの改行は、表示されるテキストの改行に対応していません。

プレーンテキストのみを使用することはできません(中国語の文字は有効なエンコーディングで問題ありません)、RTF specをご覧ください。あなたはそれが悪夢であることを発見します。 RTFを解析して "行"を "行"で読むことができるサードパーティ製のライブラリです。私はそのような図書館を探したことはありませんので、私の頭の上から何の提案もありませんが、彼らはそこにいると確信しています。

1

これは、非中国語のテキストでこれがうまくいくのは奇跡です。 "\ n"はRTFの行区切り文字ではなく、 "\ par"です。より多くのダメージがRTFヘッダーに加えられる可能性は確かに中国人にとっては大きいです。

C++はこれに対処するための最良の言語ではありません。

using System; 
using System.Windows.Forms; // Add reference 

class Program { 
    static void Main(string[] args) { 
     var rtb = new RichTextBox(); 
     rtb.LoadFile(args[0], RichTextBoxStreamType.RichText); 
     var lines = rtb.Lines; 
     for (int ix = 0; ix < lines.Length; ++ix) { 
      lines[ix] = "<item>" + lines[ix] + "</item>"; 
     } 
     rtb.Lines = lines; 
     rtb.SaveFile(args[0], RichTextBoxStreamType.RichText); 
    } 
} 

C++は、あなたがRTFパーサを見つける必要がありますハード要件である場合:それは限り、ファイルが大きくなりすぎていないとして、C#での些細な5分間のプログラムです。

関連する問題