入出力関数 (stdio.h) [OS]

管理

FILE* fopen( const char* fname, char* acc );

ファイル fname を開きます。成功すると、ファイルの読み書きに利用できる FILE 構造体が返されます。失敗すると、errno に理由コードが設定され、NULL が返されます。

アクセス モード acc には、次のいずれかの文字列を指定します。

文字列 説明
"r" 既存ファイルをテキスト モードで読み出し専用に開く。
"w" テキスト モードで書き込み専用に新規ファイルを作成する。既存の同名ファイルは削除される。
"a" テキスト モードで書き込み専用に既存ファイルを開く。ファイルが存在しない場合は、新規作成する。ファイル ポインタはファイルの末尾に移動する (追加書き込み用)。
"rb", "wb", "ab" バイナリ モードで開くことを除き、それぞれ "r"、"w"、"a" と同じ。
"r+" 既存ファイルをテキスト モードで読み書き用に開く。
"w+" 既存ファイルをテキスト モードで読み書き用に開く。ファイルが存在しない場合は、新規作成する。
"a+" ファイル ポインタがファイルの末尾に移動することを除き、"w+" と同じ。
"r+b", "w+b", "a+b" バイナリ モードで開くことを除き、それぞれ "r+"、"w+"、"a+" と同じ。

acc 文字列内の各文字の順番は自由です。たとえば、"r+b" の代わりに "rb+" と書いて同じです。

fopen で開いたファイルは、fclose で閉じます。

なお、4 つの標準入出力デバイスが最初から自動的に開かれます。

テキスト モードとバイナリ モード (cooked モードと raw モード)

テキスト モードとバイナリ モードの違いは、改行コード (\r\n) と Ctrl+Z コード (0x0A) の扱いに関係します。テキスト モードで開いた FILE を介して外部ファイルからデータを読み込んだ場合は、\r\n (0x0D,0x0A) という改行コードが単一の \n (0x0A) に変換されます。逆に、テキスト モードの FILE を介して \n を外部ファイルに書き込むと、実際には \r\n が書き込まれます。また、テキスト モードの FILE から Ctrl+Z が読み込まれると、ファイルの終端 (EOF) に達したものと見なされます。

FILE* freopen( const char* fname, char* acc, FILE* fp );

開いているファイル fp を閉じて、別のファイルをオープンし、fp に関連付けます。fp に NULL を指定すると、fopen と同じになります。fp が返されます。fp を閉じるときにエラーが発生しても、無視されます。

この関数は、stdout などの標準入出力を別のファイルにリダイレクトする場合によく使用されます。
freopen( "output.log", "w", stdout );
printf( "Hello\n" ); // output.log に書き込まれる

acc の詳細については、fopen の説明を参照してください。

int fclose( FILE* fp );

fopen で開いたファイル fp を閉じます。成功すると 0、失敗すると -1 が返されます。

int fflush( FILE* fp );

書き込み可能なファイルでは、ファイル バッファの内容が物理ファイルに書き込まれます。fflush を呼び出さなくても、ファイルを閉じればファイル バッファの内容が物理ファイルに書き込まれます。

読み出し可能なファイルでは、物理ファイルの内容がファイル バッファに読み出されます。

int fseek( FILE* fp, long offs, int org );
int
fsetpos( FILE* fp, fpos_t* ptr );
int
rewind( FILE* fp );

ファイルの位置を指定します。成功すると 0、失敗すると -1 が返されます。

fseekorg には、次のいずれかを指定します。

SEEK_SET offs に絶対的な位置を指定
SEEK_CUR offs に現在の位置からのオフセット (正または負) を指定
SEEK_END offs に末尾からの距離 (0 以下) を指定

fsetpos は、fseek( fp, *ptr, SEEK_SET ) と同じです。

rewind は、ファイルを先頭に戻します。fseek( fp, 0, CUR_SET ) と同じです。

long ftell( FILE* fp );
int
fgetpos( FILE* fp, fpos_t* ptr );

ファイルの位置を取得します。

ftell では、成功するとファイルの絶対位置、失敗すると -1L が返されます。

fgetpos では、成功するとファイルの絶対位置が *ptr に設定され、0 が返されます。失敗すると -1 が返されます。

int feof( FILE* fp );

過去にファイル fp の末尾を超えて読み出した場合は、0 以外が返されます。fseekfsetposfrewind、または clearerr を呼び出すと、この状態がクリアされ、再び 0 が返されるようになります。

int ferror( FILE* fp );

過去にファイル fp でエラーが発生した場合は、0 以外が返されます。clearerr を呼び出すと、この状態がクリアされ、再び 0 が返されるようになります。

void clearerr( FILE* fp );

ファイル fp の終端フラグとエラー フラグをクリアします。これにより、feofferror が再び 0 を返すようになります。

int setvbuf( FILE* fp, char* buf, int mode, size_t len );

ファイル fp のファイル バッファを設定します。または、出力ファイルをバッファリングしないことを指定します。この関数への呼び出しは、fopen または fopen でファイルを開いた後、そのファイルに対して他の操作を行う前に実行する必要があります。

mode には、次のいずれかを指定します。

_IONBF 入出力をバッファリングしない
_IOFBF 入出力を完全にバッファリングする
_IOLBF 入出力を行ごとにバッファリングする

Light C では、行ごとのバッファリングはサポートされず、_IOLBF_IOFBF と同じです。また、入力可能なファイルは、この関数による指定にかかわりなく常にバッファリングされます。

buf には、バッファとして使用するメモリまたは NULL を指定します。buf に指定したメモリは、ファイルを閉じるまで解放されてはなりません。NULL を指定すると、既定のバッファが使用されます。

len には、buf に指定したバッファの長さを指定します。少なくとも 20 (_FBUF_MARGIN * 2) 以上を指定する必要があります。buf に NULL を指定した場合、len は無視されます。

既定では、stdout、stderr、stdprn 以外のすべてのファイルがバッファリングされます。既定のファイル バッファのサイズは、256 バイトです。

void setbuf( FILE* fp, char* buf );

ファイル バッファを設定します。buf には、長さ BUFSIZ 以上のメモリか、NULL を指定します。buf に NULL 以外を指定した場合は、次の呼び出しと同じです。

setvbuf( fp, buf, _IOFBF, BUFSIZ );

buf に NULL を指定した場合は、次の呼び出しと同じです。

setvbuf( fp, NULL, _IONBF, 0 );

int remove( char* path );

ファイル path を削除します。成功すると 0 を返し、失敗すると errno に理由コードを設定して 0 以外を返します。path で指定したファイルが fopen などで開かれているとエラーになります。

int rename( char* oldpath, char* newpath );

ファイル oldpath の名前を newpath に変更します。成功すると 0 を返し、失敗すると errno に理由コードを設定して 0 以外を返します。同じドライブであれば、ファイルを別のディレクトリに移動することもできます。

char* tmpnam( char* buf );

重複しない一時ファイル名を取得します。TMP_MAX 回までの呼び出しが保証されています。buf には、L_tmpnam バイト以上のバッファか、NULL を指定します。NULL 以外を指定すると、作成されたファイル名が buf に格納され、buf が返されます。NULL を指定すると、作成されたファイル名は関数の内部バッファに格納され、そのアドレスが返されます。

FILE* tmpfile( void );

アクセス モード "w+b" で一時ファイルを開きます。一時ファイルは、閉じたときに自動的に削除されます。

int _filecpy( FILE* fpi, FILE* fpo, long len );

fpi の現在の位置以降の内容を fpo に最大 len バイト コピーします。len に負の値を指定すると、fpi の最後まですべての内容がコピーされます。成功すると 0、失敗すると 0 以外が返されます。

int _find_first( char* path, int attr, struct _find_t* dta );
int
_find_next( struct _find_t* dta );

ワイルドカードに一致するファイル名を順に検索します。 最初に、_find_first を呼び出します。path には、検索するファイルのパスを指定します。「*.*」などのワイルドカードを指定したり、ディレクトリを含めることができます。attr には、次の値の組み合わせを指定します。

0x00 通常のファイルだけを検索する
0x02 隠しファイルも検索する
0x04 システム ファイルも検索する
0x10 ディレクトリも検索する

dta には、結果を受け取る _find_t 構造体のアドレスを指定します。_find_t 構造体は、stdio.h で次のように定義されています。
struct _find_t
{ char reserved[21]; // 予約済み
  char attrib; // ファイルの属性
  unsigned wr_time; // 更新時刻 (DOS 形式)
  unsigned wr_date; // 更新日付 (DOS 形式)
  long size; // ファイルのサイズ
  char name[13]; // ファイル名
};

一致するファイルが存在する場合は、dta にそのファイルの情報が格納され、_find_first からは 0 が返されます。一致するファイルがない場合は、-1 が返されます。 続けて _find_next を呼び出すと、path に一致する他のファイルが順に検索されます。_find_first と同様に、一致するファイルがあれば 0、なければ -1 が返されます。

出力

テキスト モードのファイル構造体 FILE を介して出力した場合は、改行コード \n が \r\n に変換されます。stdout と stderr は、テキスト モードのファイル構造体として実装されています。

int printf( const char* form, ... );
int
vprintf( const char* form, va_list lst );

データを書式化して標準出力 (stdout、通常はディスプレイ画面) に出力します。出力先が異なることを除き、sprintf および vsprintf と同じです。

int puts( const char* str );

ヌル終端文字列 str を標準出力 stdout に出力した後、改行を出力します。成功すると 0、失敗すると 0 以外を返します。文字列末尾の 0 は出力されません。

int putchar( int c );

1 バイト データ c を標準出力 stdout に出力し、成功すると c、失敗すると EOF を返します。

int fprintf( FILE* fp, const char* form, ... );
int
vfprintf( FILE* fp, const char* form, va_list lst );

データを書式化してファイル fp に出力します。出力先が異なることを除き、sprintf および vsprintf と同じです。

size_t fwrite( const void far* buf, size_t size, size_t num, FILE* fp );

buf からサイズ size のデータを num 個だけファイル fp に出力し、実際に出力された個数を返します。エラーが発生するか、EOF に到達した場合、戻り値は num より小さくなります。

Light C では、size × num の値が 64 KB を超えてはなりません。

Light C では、far データを簡単に出力できるように、buf が far ポインタとして実装されています。buf に near ポインタを渡すと、言語の仕様により、自動的に far ポインタに変換されます。

改行コード \n が \r\n に変換された場合は、戻り値 × size より長いデータが出力されています。

int fputs( const char far* str, FILE* fp );

ヌル終端文字列 str をファイル fp に出力し、成功すると 0、失敗すると 0 以外を返します。文字列末尾の 0 は出力されません。

int fputc( int c, FILE* fp );
int
putc( int c, FILE* fp );

1 バイト データ c をファイル fp に出力し、成功すると c、失敗すると EOF を返します。この 2 つの関数は同じです。

int _putw( int c, FILE* fp );

2 バイトのデータを出力することを除き、fputc と同じです。下位 8 ビットが先頭バイトになります。

入力

テキスト モードのファイル構造体 FILE を介して入力した場合は、改行コード \r\n が \n に変換されます。また、Ctrl+Z コード 0x1A が EOF と見なされます。stdin は、テキスト モードのファイル構造体で実装されています。

int scanf( const char* form, ... );
int
vscanf( const char* form, va_list lst );

標準入力 (stdin、通常はキーボード) からデータを入力します。データの入力元が異なることを除き、sscanf および vsscanf と同じです。

char* gets( char* buf );

標準入力 (stdin) から 1 行のデータを buf に読み込みます。成功すると buf、失敗すると NULL が返されます。buf の末尾に改行文字は付加されません。

int getchar( void );

標準入力 (stdin) から 1 バイトを入力して返します。ファイルが終了したか、エラーが発生した場合は、EOF が返されます。

int fscanf( FILE* fp, const char* form, ... );
int
vfscanf( FILE* fp, const char* form, va_list lst );

ファイル fp からデータを入力します。データの入力元が異なることを除き、sscanf および vsscanf と同じです。

size_t fread( const void* buf, size_t size, size_t num, FILE* fp );

ファイル fp から最大 size × num バイトのデータを buf に読み込み、実際に読み込んだデータの個数を返します。実際に読み込まれたデータのバイト数は、戻り値 × size で求められます。エラーが発生するか、EOF に到達した場合、戻り値は num より小さくなります。

Light C では、size × num の値が 64 KB を超えてはなりません。

fp がテキスト モードの場合は、改行コード変換後のバイト数 ÷ size (端数切り捨て) が返されます。

char* fgets( char* buf, int len, FILE* fp );

ファイル fp から 1 行または len-1 バイトのデータを buf に読み込みます。成功すると buf、失敗すると NULL が返されます。 \n に遭遇するか、ファイルが終了するか、len-1 バイトを読み出した時点で入力が終了し、末尾に 0 が付加されます。\n で終了した場合は、\n 自体も buf に入ります。

int fgetc( FILE* fp );
int
getc( FILE* fp );

ファイル fp から 1 バイトを入力して返します。ファイルが終了したか、エラーが発生した場合は、EOF を返します。この 2 つの関数は同じです。

int _getw( FILE* fp );

2 バイトのデータを入力することを除き、fputc と同じです。先頭バイトが下位 8 ビットになります。

int ungetc( int c, FILE* fp );

読み出した 1 バイトのデータ c を入力元に戻します。成功すると c、失敗すると EOF が返されます。次に同じ fp からデータを入力すると、この関数で戻したバイトが最初に読み出されます。

Light C では、連続して 10 (stdio.h の _FBUF_MARGIN) 回までバイトを戻すことができます。また、バイトを戻した後も、テキスト モードのファイルにおける改行コード変換によるずれを除き、ftell や fgetpos から正しい値が返されます。 ただし、ISO/JIS/ANSI 規格では、ungetc の呼び出しは連続 1 回しか保証されていません。また、ungetc 呼び出し直後の ftell や fgetpos の結果も保証されていません。

低水準入出力

次の関数は、バッファリングなどの処理を介在させることなく、直接 OS (MS-DOS) のファンクションを呼び出します。どの関数も、失敗すると -1 を返し、errno に理由コードを設定します。

fopen などの高水準関数は、内部でこれらの関数を呼び出します。

int _creat( const char* fname );

ファイルを新規作成し、そのハンドルを返します。同じ名前のファイルがあると、上書きされます。失敗すると -1 が返されます。

int _open( const char* fname, int acc );

既存のファイルを開き、そのハンドルを返します。既存のファイルがなければ失敗します。失敗すると -1 が返されます。

acc には、次のいずれかを指定します。

0 読み出し専用
1 書き込み専用
2 読み書き可能

int _close( int hdl );

ファイルを閉じます。hdl には、_open または _creat で取得したハンドルを指定します。成功すると 0、失敗すると -1 が返されます。

int _write( int hdl, const void far* buf, size_t size );

指定バイトのデータをファイルに書き込みます。成功すると実際に書き込まれたバイト数が返され、失敗すると -1 が返されます。

int _read( int hdl, void far* buf, size_t size );

ファイルから指定バイトのデータを読み出します。成功すると実際に読み出されたバイト数が返され、失敗すると -1 が返されます。

int _lseek( int hdl, long offs, int org );

ファイルの位置を設定します。新しいファイル位置が返されるため、ファイル位置の取得にも使用できます。org には、fseek と同じように SEEK_xxx 値を指定します。失敗すると -1 が返されます。

参照   入出力先の変更