Cファイルの入出力

C言語は、ファイル入出力ための標準ライブラリ関数を多数提供しています。これらの関数は、C標準ライブラリヘッダー< stdio.h >の大部分を占めています。[ 1 ]これらの機能は、 1970年代初頭にベル研究所マイク・レスクが作成した「ポータブルI/Oパッケージ」に由来しており、 [ 2 ] Unixオペレーティングシステムのバージョン7で正式に採用されました。[ 3 ]

C言語のI/O機能は、現代の標準からするとかなり低レベルです。C言語は、すべてのファイル操作をバイトストリーム(「入力ストリーム」または「出力ストリーム」)に対する操作に抽象化します。以前のプログラミング言語とは異なり、C言語はランダムアクセスデータファイルを直接サポートしていません。ファイルの途中にあるレコードから読み取るには、プログラマーはストリームを作成し、ファイルの途中までシークし、ストリームからバイトを順番に読み取る必要があります。

ファイルI/Oのストリームモデルは、C言語と同時期に開発されたUnixによって普及しました。現代のオペレーティングシステムの大部分はUnixからストリームを継承しており、C言語ファミリーの多くの言語もCのファイルI/Oインターフェースをほとんど、あるいは全く変更することなく継承しています(例えばPHP)。

概要

このライブラリは、キーボード、プリンター、端末などの物理デバイス、あるいはシステムがサポートするその他のファイル形式を扱うために、いわゆるストリームを使用します。ストリームとは、これらを統一的に操作するための抽象化です。すべてのストリームは、関連付けられている物理メディアの個々の特性とは無関係に、同様の特性を持ちます。[ 4 ]

機能

C ファイル入出力関数のほとんどは<stdio.h>(または、標準 C 機能を含みますがstd名前空間にあるC++ヘッダー)で定義されています。 <cstdio>

バイト文字 ワイド文字 説明
ファイルアクセス fopenファイルを開きます (Windows では非 Unicode ファイル名、Linux では UTF-8 ファイル名の可能性があります)
開くパイプを作成し、フォークし、シェルを呼び出すことでプロセスを開きます
フリーオープン既存のストリームで別のファイルを開きます
フラッシュ出力ストリームを実際のファイルと同期します
閉じるファイルを閉じる
閉じるストリームを閉じる
セットバッファファイルストリームのバッファを設定します
setvbufファイルストリームのバッファとそのサイズを設定します
広いファイル ストリームをワイド文字 I/O とナロー文字 I/O の間で切り替えます。
直接入力/出力 読むファイルから読み取る
書き込みファイルに書き込む
フォーマットされていない入出力 fgetc getcfgetwc getwcファイルストリームから バイト/ wchar_tを読み取ります
fgetsfgetwsファイルストリームから バイト/ wchar_t行を読み取ります
fputc putcfputwc putwcバイト/ wchar_tをファイルストリームに 書き込みます
fputsfputwsバイト/ wchar_t文字列をファイルストリームに 書き込みます。
getchargetwcharstdinから バイト/ wchar_tを読み取ります
取得する該当なし改行またはファイル終了に達するまで、stdin からバイト文字列を読み取ります (C99 では非推奨、C11 では削除)
プッチャーputwcharbyte/ wchar_tをstdoutに 書き込む
置く該当なしバイト文字列をstdoutに書き込む
ウンジェクト取得しないバイト/ wchar_tをファイルストリームに戻します
フォーマットされた入出力 scanf fscanf sscanfwscanf fwscanf swscanfstdin、ファイルストリーム、またはバッファ からフォーマットされたバイト/ wchar_t入力を読み取ります。
vscanf vfscanf vsscanfvwscanf vfwscanf vswscanf可変引数リストを使用して、stdin、ファイルストリーム、またはバッファ からフォーマットされた入力バイト/ wchar_tを読み取ります。
printf fprintf sprintf snprintfwprintf fwprintf swprintfフォーマットされたバイト/ wchar_t出力をstdout、ファイルストリーム、またはバッファ に出力します。
vprintf vfprintf vsprintf vsnprintfvwprintf vfwprintf vswprintf可変引数リストを使用して、フォーマットされたバイト/ wchar_t出力をstdout、ファイルストリーム、またはバッファ に出力します。
恐怖該当なし現在のエラーの説明をstderrに 書き込みます
ファイルの位置 ftell ftello 現在のファイル位置インジケータを返します
fseek fseeko ファイル位置インジケータをファイル内の特定の場所に移動する
fgetposファイル位置インジケータを取得します
fsetposファイル位置インジケータをファイル内の特定の場所に移動する
巻き戻すファイル位置インジケータをファイルの先頭に移動する
エラー処理 より明確にエラーをクリアする
フェオフファイルの終わりをチェックする
恐怖ファイルエラーをチェックします
ファイルの 操作取り除くファイルを消去する
名前を変更するファイルの 名前を変更する
一時ファイル一時ファイルへのポインタを返します
tmpnam一意のファイル名を返します

定数

ヘッダーで定義されている定数は<stdio.h>次のとおりです。

名前注記
終了ファイルの終わりを示すために使用される int型の負の整数
バッファサイズsetbuf()関数 で使用されるバッファのサイズを表す整数
ファイル名_MAX 開くことができるファイルの名前を格納するのに十分な大きさの char配列のサイズ
FOPEN_MAX 同時に開くことができるファイルの数。少なくとも8つ
_IOFBF 「入出力が完全にバッファリングされている」の略語。これは、開いているストリームのブロックバッファリングされた入出力 を要求するためにsetvbuf()関数に渡される整数です。
_IOLBF 「入出力ラインバッファ」の略語。これは、開いているストリームのラインバッファ入出力を 要求するためにsetvbuf()関数に渡される整数です。
_IONBF 「バッファリングされていない入出力」の略語。これは、開いているストリームのバッファリングされていない入出力 を要求するためにsetvbuf()関数に渡される整数です。
L_tmpnam tmpnam()関数 によって生成された一時ファイル名を格納するのに十分な大きさのchar配列のサイズ
ヌル ヌルポインタ定数に展開されるマクロ。つまり、メモリ内のオブジェクトの有効なアドレスでは ないことが保証されたポインタ値を表す定数。
シーク_CUR 現在のファイル位置からの相対的な位置を要求するために fseek()関数に渡される整数
シーク_エンド ファイルの末尾からの相対位置を要求するために fseek()関数に渡される整数
シークセット ファイルの先頭からの相対位置を要求するために fseek()関数に渡される整数
TMP_MAX tmpnam()関数によって生成できる一意のファイル名の最大数は少なくとも25である。

変数

ヘッダーで定義される変数は<stdio.h>次のとおりです。

名前注記
標準入力標準入力ストリーム (通常はキーボード) を参照する FILEへのポインタ。
標準出力標準出力ストリーム (通常はディスプレイ端末) を参照する FILEへのポインタ。
標準エラー出力標準エラー ストリーム (多くの場合、ディスプレイ ターミナル) を参照する FILEへのポインター。

メンバーの種類

ヘッダーで定義されるデータ型は<stdio.h>次のとおりです。

  • ファイル– とも呼ばれるファイルハンドルまたはFILEポインター。これは、ファイルまたはテキスト ストリームについて、入出力操作を実行するために必要な次のような情報を含む 不透明なポインター
    • ファイル記述子などの関連するI/Oデバイスのプラットフォーム固有の識別子
    • バッファ
    • ストリームの方向インジケーター(未設定、狭い、または広い)
    • ストリームバッファリング状態インジケーター(バッファなし、ラインバッファ、完全バッファ)
    • I/O モード インジケーター (入力ストリーム、出力ストリーム、または更新ストリーム)
    • バイナリ/テキストモードインジケーター
    • ファイル終了インジケータ
    • エラーインジケーター
    • 現在のストリーム位置とマルチバイト変換状態( 型のオブジェクトmbstate_t
    • 再入可能ロック( C11以降で必須)
  • fpos_t– ファイル内のすべてのバイトの位置と、サポートされているすべてのマルチバイト文字エンコーディングで発生する可能性のあるすべての変換状態を一意に識別できる非配列型
  • size_tsizeof演算子の結果の型である符号なし整数型。

拡張機能

POSIX標準で<stdio.h>、基本定義にいくつかの拡張機能が定義されています。その中にはreadline、メモリを割り当てる関数、FILEオブジェクトとファイル記述子間のリンクを確立する関数fileno、メモリ内バッファを参照するオブジェクトを作成する関数群などがあります。 [ 5 ]fdopenFILE

次の C プログラムは、 myfileというバイナリ ファイルを開き、そこから 5 バイトを読み取って、ファイルを閉じます。

#include <stdio.h> #include <stdlib.h>int main ( void ) { char buffer [ 5 ]; size_t len ; FILE * fp = fopen ( "myfile" , "rb" );if ( fp == NULL ) { perror ( "ファイル\" myfile \"を開けませんでした" ); return EXIT_FAILURE ; }if (( len = fread ( buffer , 1 , 5 , fp )) < 0 ) { fclose ( fp ); fputs ( "ファイルの読み取り中にエラーが発生しました。\n " , stderr ); return EXIT_FAILURE ; }fclose ( fp );printf ( "読み取られたバイト数: " ); for ( int i = 0 ; i < len ; ++ i ) { printf ( "%02X " , buffer [ i ]); } putchar ( '\n' );EXIT_SUCCESSを返します; }

stdioの代替

の代替手段がいくつか<stdio.h>開発されています。その中には、 C++標準ライブラリの一部であるC++ I/Oヘッダー<iostream>とがあります。ISO C++では依然としてこの機能が必要であり、これはヘッダー にあります。 <print><stdio.h><cstdio>

他の選択肢としては、AT&Tベル研究所のSfio [ 6 ](A Safe/Fast I/O Library)ライブラリがあります。このライブラリは1991年に導入され、設計における矛盾、安全でない慣行、非効率性を回避することを目的としていました。その機能の一つに、ストリームにコールバック関数を挿入して、ストリームから読み取ったりストリームに書き込んだりするデータの処理をカスタマイズする機能があります。 [ 7 ] [ 8 ]これは1997年に外部にリリースされ、最後の公式安定リリースは2005年2月1日でした[ 9 ] [ 10 ] [ 11 ]<stdio.h>

参照

参考文献

  1. ^ ISO/IEC 9899:1999仕様。274ページ、§7.19。
  2. ^カーニハン, ブライアン;パイク, ロブ(1984). UNIXプログラミング環境.エングルウッドクリフス:プレンティスホール. p. 200.書誌コード: 1984upe..book.....K .
  3. ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). CSTR. ベル研究所. 139.
  4. ^ "(stdio.h) - C++ リファレンス" . C++ . 2021年7月25日閲覧
  5. ^stdio.h  – ベース定義リファレンス、 The Single UNIX 仕様、バージョン 5、 The Open Group
  6. ^ 「Sfio: 安全で高速なI/Oライブラリ」。2006年2月11日時点のオリジナルよりアーカイブ2021年3月16日閲覧。{{cite web}}: CS1 maint: bot: 元のURLステータス不明(リンク
  7. ^ Korn, David G. ; Vo, Kiem-Phong (1991). SFIO: 安全で高速な文字列/ファイルIO . Proc. Summer USENIX Conf. CiteSeerX 10.1.1.51.6574 . 
  8. ^ Fowler, Glenn S.; Korn, David G.; Vo, Kiem-Phong (2000). Sfio による拡張フォーマット. Proc. Summer USENIX Conf.
  9. ^ 「sfio ソフトウェアダウンロードパッケージリスト」。2012年1月19日時点のオリジナルよりアーカイブ2026年1月17日閲覧。{{cite web}}: CS1 maint: bot: 元のURLステータス不明(リンク
  10. ^ sfio-2005-02-01
  11. ^ sfio-AST-2012-08-01