2016-05-23 11 views
1

テキスト(ヒンディー語または英語以外の言語)をデータ構造体に読み込むプログラムで作業しようとしています。このテキストを指す部分はvoid *ポインタです。 fprintfを使用して、このテキストのサブストリングを印刷するにはどうすればよいですか?(void *)文字列から単語を印刷するには

EDIT:出力で

/* some text manipulation stuff. */ 
    wchar_t *origString = L"इसरो ने लॉन्च किया पहला 'मेड इन इंडिया' स्पेस शटल, PM बोले- ये असाधारण और प्रेरणादायक काम"; 
    void *pText = (void *)origString; 
    wchar_t *newString = (wchar_t*)pText; 
    fprintf(stdout, "Old String: %ls\n", origString); 
    fprintf(stdout, "New string: %ls\n", newString); 

、私は特別な、印刷不能文字(私は期待していないUTF-8エンコーディング)を参照してください。

EDIT:
私はサードパーティのコードを使用してテキストを読み込み(英語以外の言語で)、さらに処理しています。このテキストをコンソールに表示する必要もあります。
サードパーティのコードは次のとおりです。
1.ファイルのサイズを取得します。
2.(freadを介して)テキスト全体を読み込み、void *を使用してこのBLOBを指します。
3.このテキストを操作する方法を理解しようとしています。印刷するにはどうすればよいですか?

+2

これを(char *)ポインターにキャスト –

+1

試しましたか?もし持っていたら、あなたが試したことを投稿してください。 –

+0

'fwrite(ポインタ、1、長さ、stdout);'はキャストやヌル終了のデータを必要としません。 –

答えて

1

印刷このテキスト

の部分文字列がちょうど必要に応じて、ポインタをキャストし、サブストリングの長さを提供します。

FILE *out; /* init FILE */ 
void *pointer; /* init pv */; 
size_t offset; /* start of substring */ 
unsigned length; /* substring length */ 
fprintf(out, "%*s", length, (char *) pointer + offset); 
+0

Cでキャストする必要があるまれなケースの1つです。 – alk

+0

UTF-8文字列の部分文字列を取り、それが有効なUTF -8文字列の部分文字列オフセットはマルチバイト記号を分割する可能性があるためです。言い換えれば、OPの目標が文字境界で分割されることになっている場合、問題はより複雑になります。 – Enno

5

任意のワイド文字の文字列を使用すると、出力できるものに変換されませんUTF-8ベースのロケールを除きます。プログラムの起動時に、初期ロケールは "C"です。現代のシステムではUTF-8ベースでなければならない文字エンコーディングのデフォルトロケールを有効にするには、setlocale(LC_CTYPE,"")に電話する必要があります。 (私はもともと述べていたとして、あなたは、代わりにすべてのロケールカテゴリだけでなく、文字エンコーディングを有効にするにはsetlocale(LC_ALL,"")を使用することができますが、それはあなたが潜在的に小数点で動作するすべての機能を壊すように望んでいないかもしれない影響の多くを持っています。)

void *キャストはあなたの質問と無関係です。ポインタ型を変換しても、ポインタのデータは変換されません。

+2

「LC_ALL」ではなく「LC_CTYPE」を実行してください。 'LC_NUMERIC'を設定すると数値関数(' strtod'まで)が壊れます。スレッドセーフな方法はありません。または、UTF-8を出力して、この悲しいエンコーディングが起こったことはまったくないと思ってください。 –

+0

@MatteoItalia:ありがとう。私はそれに応じて私の答えを変更しました。 –

+0

ありがとう、upvoted! –

関連する問題