Cファイル入出力

フリー百科事典ウィキペディアより
ナビゲーションにジャンプ 検索にジャンプ

C プログラミング言語には、ファイルの入出力用の標準ライブラリ 関数が多数用意されていますこれらの関数は、C 標準ライブラリヘッダー<stdio.h>の大部分を占めています。[1]この機能は、1970 年代初頭に Bell Labs のMike Leskによって書かれた「ポータブル I/O パッケージ」に由来し[2] 、バージョン 7で正式にUnixオペレーティング システムの一部になりました[3]

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

ファイル I/O のストリーム モデルは、C プログラミング言語自体と同時に開発された Unix によって普及しました。最新のオペレーティング システムの大部分は Unix からストリームを継承しており、C プログラミング言語ファミリの多くの言語はC のファイル I/O インターフェイスを継承しており、変更があったとしてもほとんどありません (たとえば、PHP )。

概要

このライブラリは、ストリームと呼ばれるものを使用して、キーボード、プリンター、端末などの物理デバイス、またはシステムでサポートされているその他の種類のファイルを操作します。ストリームは、統一された方法でこれらと対話するための抽象化です。すべてのストリームは、関連付けられている物理メディアの個々の特性に関係なく、同様のプロパティを持っています。[4]

機能

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

バイト
文字
ワイド
文字
説明
ファイルアクセス 開く ファイルを開きます (Windows では非 Unicode ファイル名で、Linux では UTF-8 ファイル名の可能性があります)。
フリーオープン 既存のストリームで別のファイルを開きます
フラッシュ 出力ストリームを実際のファイルと同期します
閉じる ファイルを閉じます
セットバッファ ファイル ストリームのバッファを設定します
setvbuf ファイル ストリームのバッファとそのサイズを設定します
横に ワイド文字 I/O とナロー文字 I/O の間でファイル ストリームを切り替えます
ダイレクト
入出力
恐れる ファイルから読み取ります
書き込み ファイルに書き込みます
フォーマットされていない
入出力
fgetc
getc
fgetwc
getwc
ファイル ストリームから byte/ wchar_tを読み取ります
fgets fgetws ファイル ストリームから byte/ wchar_t行を読み取ります
fputc
putc
fputwc
putwc
byte/ wchar_tをファイルストリームに 書き込みます
fput fputws byte/ wchar_t文字列をファイル ストリームに 書き込みます
ゲッター getwchar 標準入力から byte/ wchar_tを読み取ります
取得 改行またはファイルの終わりが検出されるまで、stdin からバイト文字列を読み取ります (C99 で廃止され、C11 から削除されました)。
プチャー putwchar byte/ wchar_tを stdout に 書き込みます
置く バイト文字列を stdout に書き込みます
取得しない 取得しない byte/ wchar_tをファイルストリームに戻します
フォーマットされた
入出力
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
標準入力、ファイル ストリーム、またはバッファ からフォーマットされた byte/ wchar_t入力を読み取ります
vsscanf
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
可変引数リストを使用して、標準入力、ファイル ストリーム、またはバッファ からフォーマットされた入力バイト/ wchar_tを読み取ります
printf
fprintf
sprintf
snprintf
wprintf
fwprintf
swprintf
フォーマットされた byte/ wchar_t出力を stdout、ファイル ストリーム、またはバッファ に出力します
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
可変引数リストを使用して、フォーマットされたバイト/ wchar_t出力を stdout、ファイル ストリーム、またはバッファに 出力します。
エラー 現在のエラーの説明を stderr に書き込みます
ファイルの配置 ftell
ftello
現在のファイル位置インジケータを返します
fseek
fseeko
ファイル位置インジケータをファイル内の特定の場所に移動します
fgetpos ファイル位置インジケータを取得します
fsetpos ファイル位置インジケータをファイル内の特定の場所に移動します
巻き戻し ファイル位置インジケータをファイルの先頭に移動します
エラー
処理
クリアエラー エラーをクリアします
フェオフ ファイルの終わりをチェックします
恐怖 ファイルエラーをチェックします

ファイル 操作
削除する ファイルを消去します
名前を変更 ファイルの 名前を変更します
tmpファイル 一時ファイルへのポインタを返します
tmpnam 一意のファイル名を返します

定数

<stdio.h>ヘッダー で定義されている定数には次のものがあります。

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

変数

Stdstreams-notitle.svg

<stdio.h>ヘッダー で定義される変数には次のものがあります。

名前 ノート
標準入力 標準入力ストリーム (通常はキーボード) を参照 するFILEへのポインター。
標準出力 標準出力ストリーム (通常は表示端末) を参照 するFILEへのポインター。
標準エラー 標準エラー ストリーム (多くの場合、表示端末) を参照 するFILEへのポインター。

メンバーの種類

<stdio.h>ヘッダー で定義されているデータ型には次のものがあります。

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

拡張機能

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

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

#include <stdio.h> 
#include <stdlib.h> 

intメイン(ボイド) {  
    文字バッファ[ 5 ]; 
    FILE * fp = fopen ( "myfile" , "rb" );    

    if ( fp == NULL ) {    
        perror ( "ファイル\" myfile \"を開けませんでした " " );
        EXIT_FAILUREを返します。 
    }

    for ( int i = 0 ; i < 5 ; i ++ ) {         
        int rc = getc ( fp );   
        もし( rc == EOF ) {    
            fputs ( "ファイルの読み取り中にエラーが発生しました。\n " , stderr ); 
            EXIT_FAILUREを返します。 
        }
        
        バッファ[] = rc ;  
    }

    fclose ( fp );

    printf ( "読み取ったバイトは... %02x %02x %02x %02x %02x \n " ,バッファ[ 0 ],バッファ[ 1 ],  
        バッファ[ 2 ]、バッファ[ 3 ]、バッファ[ 4 ]);  

    EXIT_SUCCESSを返します。 
}

stdio の代替

stdioの代替手段がいくつか開発されています。これらの中には、 ISO C++ 標準の一部であるC++ iostreamライブラリがあります。ISO C++ には、引き続きstdio機能が必要です。

他の代替手段には、AT&T Bell Laboratoriesの SFIO [6] (A Safe/Fast I/O Library) ライブラリが含まれます。1991 年に導入されたこのライブラリは、 stdioの設計における矛盾、危険な慣行、および非効率性を回避することを目的としていましたその機能の中には、コールバック関数をストリームに挿入して、ストリームから読み込んだり、ストリームに書き込んだりしたデータの処理をカスタマイズする機能があります。[7] 1997 年に外部にリリースされ、最後のリリースは 2005 年 2 月 1 日でした。[8]

も参照

参考文献

  1. ^ ISO/IEC 9899:1999 仕様 (PDF) . p。274、§ 7.19。
  2. ^ カーニハン、ブライアンパイク、ロブ(1984)。UNIX プログラミング環境Englewood Cliffs :プレンティス ホールp。200。
  3. ^ McIlroy, MD (1987). リサーチ Unix リーダー: Programmer's Manual, 1971–1986 (PDF) (Technical report)からの注釈付き抜粋。CSTR。ベル研究所。139。
  4. ^ "(stdio.h) - C++ リファレンス" .
  5. ^ stdio.h  – ベース定義リファレンス、 The Single UNIX Specification、バージョン 4 (The Open Group 提供)
  6. ^ "SFIO: 安全で高速な I/O ライブラリ" . 2006 年 2 月 11 日のオリジナルからのアーカイブ2021年3月16日閲覧{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  7. ^ コーン、デビッド G .; Vo, Kiem-Phong (1991)。SFIO: 安全/高速文字列/ファイル IO . 議事録 夏のUSENIX Conf. CiteSeerX 10.1.1.51.6574 . 
  8. ^ ファウラー、グレン S.; コーン、デビッド G.; Vo, Kiem-Phong (2000)。Sfio による拡張フォーマット議事録 夏のUSENIX Conf.

外部リンク