0

私の目的は、ANSIでエンコードされたテキストを読むことです。しかし、いくつかの理由で、私はfgetws()(fgetsではなく)関数を使用しており、もちろんファイルはバイナリモードで開かれます。これが私の問題を示す短いコードです

  bool testfunc(wchar_t path[])
  {
     wchar_t buffer[10];

     if( FILE * fr=_wfopen(path,L"rb") )
     {
        fgetws(buffer,sizeof(buffer),fr);
        fclose(fr);
        return true;
     }
     else return false;
  }

この関数を呼び出して、ANSIエンコードされたテキストファイルパスを引数として渡すと、実行時にアクセス違反エラーが発生します。テキストサイズが十分に大きい場合にエラーが発生するようです。問題がどこにあるのかわかりません。

4

2 に答える 2

2

ドキュメントによると、fgetwsの 2 番目のパラメーターは、バイトではなく、配列内のワイド文字の数です。

fgetws(buffer,sizeof(buffer)/sizeof(*buffer),fr);

これに役立つ古典的なマクロは次のとおりです。

#define countof(x) (sizeof(x)/sizeof(*(x)))

または派手な C++ テンプレート:

template <typename T, int N>
int countof(T (&a)[N])
{
    return N;
}
于 2013-01-05T19:04:46.120 に答える
1

ファイルにASCII文字のみが含まれている場合 (ASCII はUnicodeのサブセットであり、 のサイズwchar_tは実装固有であり、Unicode 文字のサブセットの固定幅エンコーディングに適合する可能性があるため、wchar_tあまり移植性がないことに注意してください)個々の ASCII 文字をそれぞれ対応するワイド文字に変換します。

{
#define SIZE 80
    char cbuf[SIZE];
    wchar_t wbuf[SIZE];
    char* pc;
    wchar_t* pw;
    memset (cbuf, 0, sizeof(cbuf));
    memset (wbuf, 0, sizeof(wbuf));
    fgets (cbuf, SIZE, fr);
    for ((pc=cbuf), (pw=wbuf); pc<cbuf+SIZE && *pc != 0; pc++, pw++)
      *pw = (wchar_t) *pc;
}

PS fgetws(3) man ページのNOTESを注意深く読んでください。怖いと理解できる。

于 2013-01-05T19:14:22.290 に答える