ungetc() - 入力ストリームへの文字のプッシュ

標準

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

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

両方  

形式

#include <stdio.h>

int ungetc(int c, FILE *stream);

#define _OPEN_SYS_UNLOCKED_EXT 1
#include <stdio.h>

int ungetc_unlocked(int c, FILE *stream);

機能説明

符号なし文字に変換された c の値によって指定された 文字を提供された入力 stream にプッシュ・バックします。プッシュ・バック された文字は、そのプッシュの逆順で以降の読み取りによって 同じストリームに戻されます。すなわち、最後にプッシュされた文字が最初に 戻されます。

最大 4 文字を指定された入力ストリームにプッシュ・バック できます。したがって、最大 4 回 ungetc() を呼び出せます。これによって、結果的に合計 4 文字がプッシュ・バックされます。

stream は、読み取りのためにオープンしていなければ なりません。stream での以降の読み取り操作は、c から開始します。ungetc() を使用して EOF をストリームに プッシュ・バックできません。ungetc() 関数に対する呼び出しが正常に行われると、ストリームの EOF 標識がクリアされます。

ungetc() でプッシュ・バックされ、その後読み込まれなかった文字は、その文字が stream から読み取られる前に、関数 fseek()、fsetpos()、rewind()、または fflush() が呼び出された場合は 消去されます。すべてのプッシュ・バックされた文字が読み込まれた後で、ファイル位置標識は、文字がプッシュ・バックされる前のものと 同じになります。

プッシュ・バックの各文字は、1 バイト別にファイル位置を バックアップします。これは、ftell() または fgetpos() によって 戻された値 SEEK_CUR を使用した fseek() の結果 または fflush() の結果に影響を与えます。例えば、a b c d e f g h

を含むファイルを検討してください。
'a' を読み込んだ直後に、現行ファイル位置は 'b' の開始点に きます。次の操作では、すべて結果的にファイル位置は 'a' の 開始点にきて、再び 'a' を読み取ることができます。
/* 1 */       ungetc('a', fp);
              fflush(fp);  /* flushes ungetc char and keeps position */

/* 2 */       ungetc('a', fp);
              pos = ftell(fp); /* points to first character */
              fseek(fp, pos, SEEK_SET);

/* 3 */       ungetc('a',fp);
              fseek(fp, 0, SEEK_CUR) /* starts at new file pos'n */

/* 4 */       ungetc('a', fp);
              fgetpos(fp, &fpos); /* gets position of first char */
              fsetpos(fp, &fpos);

環境変数 _EDC_COMPAT を使用すると、z/OS® XL C/C++ アプリケーションで、SEEK_CUR を使った fflush()、fgetpos()、および fseek() の ungetc() 文字を無視することができます。詳細は、「z/OS XL C/C++ プログラミング・ガイド」を参照してください。

ungetc() 関数は、type=record または type=blocked を使用してオープンしたファイルで サポートされません。

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

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

戻り値

正常に実行された場合、ungetc() は、unsigned char に変換された 整数引数 c を戻します。

c をプッシュ・バックできない場合、ungetc() は EOF を戻します。

ungetc() は、読み取り操作として扱われます。ungetc() に 対する呼び出し後と次の書き込み操作前に、フラッシュまたは位置変更 が必要です。

CELEBU04
⁄* CELEBU04                                      

   In this example, the while statement reads decimal digits                    
   from an input data stream by using arithmetic statements to                  
   compose the numeric values of the numbers as it reads them.                  
   When a nondigit character appears before the EOF, &ungetc.                   
   replaces it in the input stream so that later input functions                
   can process it.                                                              
                                                                                
 *⁄                                                                             
#include <stdio.h>                                                              
#include <ctype.h>                                                              
                                                                                
int main(void)                                                                  
{                                                                               
   FILE *stream;                                                                
   int ch;                                                                      
   unsigned int result = 0;                                                     
                                                                                
   stream = fopen("myfile.dat","r+");                                           
   while ((ch = getc(stream)) != EOF && isdigit(ch))                            
   {                                                                            
      result = result * 10 + ch - '0';                                          
   }                                                                            
   printf("result is %i¥n",result);                                             
   if (ch != EOF)                                                               
   {                                                                            
      ungetc(ch,stream);         ⁄* Put the nondigit character back *⁄          
      ch=getc(stream);                                                          
      printf("value put back was %c¥n",ch);                                     
   }                                                                            
}                                                                               

関連情報