純粋なcでユニコードファイルを開く
質問
完全に中国人の.txtファイルを開こうとしています。ストリームが100%Unicodeになる場合でも、通常のFopen/fcloseプロシージャを使用できますか、または幅広い文字を処理するための展開ツールはありますか?私は正確な答えに感謝します、私は初心者プログラマーです。標準GCCでLinuxを使用しています。
コードを添付します。エラーなしでコンパイルしますが、実行時にセグメンテーション障害が発生します。何が悪いのかわかりません。このプログラムのポイントは、特定のセットから特定のサインが見つかる中国のサインの各文字列をコピーし、別のファイルに記述することです。
#include<stdio.h>
#include<stdlib.h>
#include<wchar.h>
#include <locale.h>
#define PLIK_IN in /*filenames*/
#define PLIK_OUT out
#define LKON 49 /*specifying the length of a string on the left from a desired sign*/
#define PKON 50 /*...and on the right*/
int wczytaj_pliki(FILE*, FILE*); /*open file*/
void krocz_po_pliku(FILE*, FILE*); /*search through file*/
int slownik(wchar_t); /*compare signs*/
void zapisz_pliki(FILE*, FILE*); /*write to file*/
void main(void)
{
FILE *bin,*bout;
setlocale(LC_CTYPE, "");
wczytaj_pliki(bin, bout);
krocz_po_pliku(bin, bout);
zapisz_pliki(bin, bout);
}/*main*/
int slownik(wchar_t znak) /*compare characters*/
{
wchar_t gznak1 = L'股', gznak2 = L'利', gznak3 = L'红';
if ( ( znak == gznak1) || (znak == gznak2) || (znak == gznak3) ) return 1;
return 0;
}/*slownik*/
void krocz_po_pliku(FILE* bin, FILE* bout) /*search through file*/
{
wchar_t wch;
wchar_t* kontekst;
int i = 0, j, step = LKON, counter = 0, token = 0;
while ( (wch = getwchar() ) != EOF )
{
if (!token) /*comparing consecutive signs*/
{
if ( slownik(wch) == 1 )
{
counter++;
fprintf(bout,"###Wystapienie %d.\n\n", counter);
if ( i<step ) step = i;
fseek(bin,-step,1);
j=0, token = 1;
}/*if*/
else i++;
}/*if*/
else /*writing consecutive signs within context*/
{
if ( j < LKON + PKON)
{
putwc(wch, bout);
j++;
}/*if*/
else
{
fprintf(bout,"###\n\n");
fflush(bout);
token = 0;
}/*else*/
}/*else*/
}/*while*/
printf("Znalazlem %d wystapien\n", counter);
}/*krocz_po_pliku*/
int wczytaj_pliki(FILE* bin, FILE* bout)
{
bin=fopen("PLIK_IN","r");
bout=fopen("PLIK_OUT","w");
rewind(bin);
if(bin==NULL || bout==NULL)
{
printf("Blad plikow\n");
exit(0);
}/*if*/
return 1;
}/*wczytaj pliki*/
void zapisz_pliki(FILE* bin, FILE* bout)
{
fclose(bin);
fclose(bout);
}
解決
あなたの問題は、あなたが
#define PLIK_IN in /*filenames*/
その後
bin=fopen("PLIK_IN","r");
あなたのプログラムは、名前のファイルを開こうとしています PLIK_IN
名前のあるファイルではありませんin
. 。もしも PLIK_IN
存在しません、 fopen
戻り値 0
. 。通過 0
に rewind
実行可能ファイルが死亡します。
開いたい場合 in
, 、 あなたがすべき
#define PLIK_IN "in" /*filenames*/
/* ... */
bin=fopen(PLIK_IN,"r");
同じことが起こります PLIK_OUT
.
最後になりましたが、英語でコーディングすることを忘れないでください。それは リンガ・フランカ 私たちのビジネスでは、それを使用すると、あなたを助けることができる人の数が大幅に増加します:)
他のヒント
はい、Fopenは、char*でファイル名を表すことができる限り、Unicodeデータを含むデータを含むファイルを開くことができます。 (一部のプラットフォーム、つまりWindowsでは、ファイルにはChar*で表現できない名前があります*)。
バイナリモードでファイルを開いて、行われる可能性のある新しいライン置換を防ぐ必要があります(UnicodeエンコードがUTF-8であり、それが問題ではない場合を除く)。また、コードユニットが複数のバイトである場合は、正しいエンディアン性でそれらを読んでいることを確認する必要があります。
WCHAR_Tは必ずしもUnicode ANではないことに注意してください。ファイルが使用しているUnicodeエンコードが使用されている場合は、適切なタイプではない場合があります。また、プログラムが複数のUnicodeエンコーディングをサポートしている場合、ファイルが使用するエンコードを推測するためにBOMを使用しないでください。