HIR-NET Home C言語 運営者 オンラインソフト 運営者著書 CG HIR-NETリンク集

ungetcアン・ゲット・シー関数かんすう
ungetc function

語源  ungetアンゲット characterキャラクター(逆入力文字)
分類  C/C++標準ライブラリ/関数/入出力関数/出力関数
名称  文字押戻関数(character pushed-back function)
対義  putc関数
同等  ungetwc関数
解説  ungetc関数は、ファイルの入力バッファに文字を戻す関数です。文字c を unsigned char に変換し、入力ストリーム*stream に押し戻します。具体的に戻されるのは入力バッファであり、ストリームに対応する外部記憶装置上のファイルに文字が戻され書き込まれる訳ではありません。
 押し戻された文字群は、この*stream の次の読込で押し戻されたのと逆順に返されます。入力バッファがない処理系であっても、1文字の押し戻しは保証されます。しかし、読込やファイル位置付の操作なしに、同じストリームに過度の押し戻しがあった場合は失敗することもあります。
 文字c の値が EOF と等しい場合の押し戻しの操作は失敗し、入力ストリームは変化しません。

関数原型宣言ヘッダ  <stdio.h>
関数原型宣言例
           押戻文字  入力ストリーム
              ↓         ↓
int ungetc(int c,FILE *stream);
↓
EOF≠押戻文字
EOF=失敗
関数返却値
①押し戻した文字c を返します。
②押し戻し操作が失敗した場合は EOF を返します。

注意1  ungetc関数呼出成功後の同一入力ストリーム対するファイル位置付関数(fseek, fsetpos, rewind)の呼出成功は stream に押し戻された文字群を捨て去ります。

注意2  ungetc関数の呼出が成功すると、そのストリームのファイル終了指示子は初期化され、終了状態でなくなります。すべての押し戻された文字群が読み込まれるか、捨てられるかした後のファイル位置指示子の値は押し戻される前と同じです。
 テキスト・ストリームの場合は、ungetc関数呼出成功後のファイル位置指示子の値は すべての押し戻された文字群が読み込まれるか、捨てられるまで、不定です。
 バイナリ・ストリームの場合は、ungetc関数呼出成功によって、ファイル位置指示子の値は減算されます。その値が呼出前に 0 であった場合には呼出後の値は不定です。

コンパイラのバグ  押し戻し操作が失敗した場合の検出が出来ないCコンパイラがあります。



 プログラム例   

文字のバッファへの押し戻し
ファイルの終わりまで文字入力した後、限界まで文字を押し戻し、再度終わりまで読み込みます。押し戻しの限度は26字までとしています。
// ungetc1.c

#include <stdio.h> // FILE,EOF,fclose,fgetc,fopen,fputs,printf,ungetc
#include <stdlib.h> // EXIT_SUCCESS


int main(void)
{
  FILE *sput; // 出力ストリーム
  FILE *sget; // 入力ストリーム
  int i;

  // ☆テストファイル作成
  sput=fopen("ungetc.tes","w");
  if(sput==NULL)return EXIT_FAILURE;
  fputs("ABCDEFGHIJK\n",sput);
  fclose(sput);


  // ☆テストファイルオープン
  sget=fopen("ungetc.tes","r");
  if(sget==NULL)return EXIT_FAILURE;

  while(1)
  {
    int c=fgetc(sget);
    if(c==EOF)break;
    printf(">%c",c); // 入力
  } // while

  for(i=0;i<26;i++) // 押戻
  {
    int c=i+'a';
    if(ungetc(c,sget)==EOF)
      break; // 失敗するまで
    printf("<%c",c);
  } // for
  printf("<\n");

  while(1)
  {
    int c=fgetc(sget);
    if(c==EOF)break;
    printf(">%c",c); // 再入力
  } // while
  printf(">\n");

  fclose(sget);

  return EXIT_SUCCESS;
} // main
実行結果  一例を示します。1文字しか戻せない処理系もあります。
>A>B>C>D>E>F>G>H>I>J>K>       …… 入力
<a<b<c<d<e<f<g<h<i<j<k<l<m<n< …… 押戻
>n>m>l>k>j>i>h>g>f>e>d>c>b>a> …… 再入力





◆リンクは、ご自由にお張りください。

Copyright © 1988-2017 Hirabayashi Masahide  プライバシーポリシー