5

完全に中国語の .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);
}
4

2 に答える 2

3

はい、fopen は、ファイル名を char* で表すことができる限り、Unicode データを含む任意のデータを含むファイルを開くことができます。(一部のプラットフォーム、つまり Windows では、ファイルの名前が char* で表現できない場合があります)。

置換は文字単位で行われるため、実行される可能性のある新しい行の置換を防ぐために、ファイルをバイナリ モードで開く必要があります (Unicode エンコーディングが UTF-8 であり、それが問題にならない場合を除きます)。また、コード単位が複数のバイトである場合、正しいエンディアンでそれらを読み取っていることを確認する必要があります。

wchar_t は必ずしも Unicode であるとは限らず、ファイルで使用されている Unicode エンコーディングに適した型ではない可能性があることに注意してください。また、プログラムが複数の Unicode エンコーディングをサポートしている場合は、BOM を使用してファイルが使用しているエンコーディングを推測しないでください。

于 2011-11-29T22:10:25.860 に答える
1

あなたの問題は、あなたが

#define PLIK_IN in /*filenames*/

その後

bin=fopen("PLIK_IN","r");

PLIK_INあなたのプログラムは、 という名前のファイルではなく、という名前のファイルを開こうとしていますinPLIK_IN存在しない場合は、 をfopen 返します 0。に渡すと、実行可能ファイルが停止0rewindます。

を開きたい場合inは、

#define PLIK_IN "in" /*filenames*/
/* ... */
bin=fopen(PLIK_IN,"r");

についても同様ですPLIK_OUT

最後になりましたが、英語でコーディングすることを忘れないでください。それは私たちのビジネスの共通語であり、それを使用することで、あなたを助けることができる人の数が大幅に増加します:)

于 2011-11-29T22:21:23.283 に答える