fgetwc() - 次のワイド文字の取得

標準

標準/拡張機能 C/C++ 依存項目

ISO C 改訂
XPG4
XPG4.2C99
Single UNIX Specification、バージョン 3
Language Environment

両方  

形式

#include <wchar.h>

wint_t fgetwc(FILE *stream);

#define _OPEN_SYS_UNLOCKED_EXT 1
#include <wchar.h>

wint_t fgetwc_unlocked(FILE *stream);

機能説明

次のマルチバイト文字を stream で指定される入力ストリーム から取得し、それをワイド文字に変換し、(定義されていれば) 関連するストリームの ファイル位置標識を進めます。

このワイド文字関数の動作は、現行ロケールの LC_CTYPE カテゴリーの影響を受けます。 カテゴリーを変更すると、未定義の結果が発生する可能性があります。

非ワイド文字関数を fgetwc() とともに使用すると、未定義の動作が 生じる結果となります。その理由は、fgetwc() がマルチバイト文字全体を処理し、非ワイド文字 の「中」にマルチバイト文字があることを予期しないことです。また、fgetwc() は、状態情報が既に設定されていることを予期します。fgetc() や fputc() などの関数はこのような規則に従わないので、これらの関数の結果は、fgetwc() の予期と一致しません。

fgetwc() には、書き込みの直後に読み取り、または読み取りの直後に 書き込みを行うための読み取り操作と同じ制約事項があります。書き込みと後続の読み取りの間には、介入フラッシュまたは位置変更が 必要です。読み取りと後続の書き込みの間でも、EOF に達していない限り、介入フラッシュまたは位置変更が必要です。

fgetwc_unlocked() は、スレッド・セーフでないことを除いて、機能的に fgetwc() と 等価です。この関数をマルチスレッドのアプリケーション内で安全に使用できるのは、 flockfile() 関数または ftrylockfile() 関数のどちらかへの呼び出しが成功した後のように、 呼び出しスレッドが (FILE*) オブジェクトを所有している間に、この関数を呼び出す場合だけです。

戻り値

正常に実行された場合、fgetwc() は、stream が指す入力ストリームから、マルチバイト文字に対応している次のワイド文字を戻します。

ストリームが EOF にある場合、ストリームの EOF 標識が設定され、fgetwc() は WEOF を戻します。

読み取り エラーが起きた場合は、ストリーム のエラー標識が設定され、fgetwc() は WEOF を戻します。 エンコード・エラー (マルチバイト文字のワイド文字への 変換エラー) が発生した場合は、EILSEQ マクロの値 (無効なシーケンス) が errno に保管され、WEOF が戻されます。

読み取りエラーと EOF を区別するには、ferror() 関数と feof() 関数を 使用します。データの最後のバイトを「超えて」読み取ろうとしたときのみ、EOF に達することに注意してください。 データの最後のバイトまで (最後のバイトを含む) 読み取ると、EOF 標識はオンになりません

CELEBF19
⁄* CELEBF19 *⁄                                                                                                                   
#include <stdio.h>                                                              
#include <stdlib.h>                                                             
#include <wchar.h>                                                              
#include <errno.h>                                                              
                                                                                
int main(void)                                                                  
{                                                                               
   FILE    *stream;                                                             
   wint_t   wc;                                                                 
                                                                                
   if ((stream = fopen("myfile.dat", "r")) == NULL) {                           
      printf("Unable to open file¥n");                                          
      exit(1);                                                                  
   }                                                                            
                                                                                
   errno = 0;                                                                   
   while ((wc = fgetwc(stream)) != WEOF)                                        
      printf("wc=0x%X¥n", wc);                                                  
                                                                                
   if (errno == EILSEQ) {                                                       
      printf("An invalid wide character was encountered.¥n");                   
      exit(1);                                                                  
   }                                                                            
                                                                                
   fclose(stream);                                                              
}                                                                               

関連情報