Cファイル入出力

Cプログラミング言語には、ファイル入出力用の標準ライブラリ 関数が多数用意されていますこれらの関数は、 C 標準ライブラリヘッダー< stdio.h >の大部分を構成します[1]この機能は、1970 年代初頭にベル研究所の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++ヘッダーcstdioで定義されます。これには標準の C 機能が含まれていますが、std名前空間にあります)。

バイト
文字
ワイド
文字
説明
ファイルアクセス フォーペン ファイルを開きます (Windows では非 Unicode ファイル名、Linux では UTF-8 ファイル名が使用される場合があります)。
フリーオープン 既存のストリームを使用して別のファイルを開きます
ふわふわした 出力ストリームを実際のファイルと同期します。
f閉じる ファイルを閉じます
セットバッファ ファイルストリームのバッファを設定します
setvbuf ファイルストリームのバッファーとそのサイズを設定します。
飛んでいく ワイド文字 I/O とナロー文字 I/O の間でファイル ストリームを切り替えます。
直接
入出力
恐れる ファイルから読み取ります
fwrite ファイルに書き込みます
フォーマットされていない
入出力
fgetc
getc
fgetwc
getwc
ファイルストリームから バイト/ wchar_tを読み取ります
fgets fgetws ファイルストリームから byte/ wchar_t行を読み取ります
fputc
putc
fputwc
putwc
byte/ wchar_tをファイル ストリームに 書き込みます
fputs fputws byte/ wchar_t文字列をファイル ストリームに 書き込みます
ゲットチャー 取得 標準入力から バイト/ wchar_tを読み取ります
取得 改行またはファイルの終わりに達するまで、stdin からバイト文字列を読み取ります (C99 で非推奨となり、C11 から削除されました)
プッチャー プットチャー バイト/ wchar_tを標準出力に 書き込みます
置く バイト文字列を標準出力に書き込みます
など 取得できません byte/ wchar_tをファイル ストリームに戻し ます
フォーマットされた
入出力
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
フォーマットされた byte/ wchar_t入力を標準入力、ファイル ストリーム、またはバッファ から読み取ります
vscanf
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
可変引数リストを使用して、フォーマットされた byte/ wchar_t出力を stdout、ファイル ストリーム、またはバッファに 出力します。
恐怖 現在のエラーの説明を標準エラー出力に 書き込みます。
ファイルの配置 フィーテル
フィーテロ
現在のファイル位置インジケーターを返します。
fseek
fseeko
ファイル位置インジケーターをファイル内の特定の場所に移動します
fgetpos ファイル位置インジケーターを取得します
fsetpos ファイル位置インジケーターをファイル内の特定の場所に移動します
巻き戻し ファイル位置インジケーターをファイルの先頭に移動します
エラー
処理
もっとはっきり エラーをクリアします
フェフ ファイルの終わりをチェックします
恐怖 ファイルエラーをチェックします

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

定数

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

名前 ノート
終了後 ファイルの終わりの条件を示すために使用される int型の負の整数
ブフシズ setbuf()関数 によって使用されるバッファのサイズを表す整数
FILENAME_MAX 開くことができる任意のファイルの名前を格納するのに十分な大きさの char配列のサイズ
FOPEN_MAX 同時に開くことができるファイルの数。少なくとも8人になるだろう
_IOFBF 「入力/出力完全バッファ」の略語。これは、オープン ストリームのブロック バッファー入出力を 要求するためにsetvbuf()関数に渡すことができる整数です。
_IOLBF 「入力/出力ラインバッファ」の略語。これは、オープン ストリームのライン バッファー入出力を 要求するためにsetvbuf()関数に渡すことができる整数です。
_IONBF 「バッファリングされていない入力/出力」の略語。これは、開いているストリームのバッファリングされていない入出力 を要求するためにsetvbuf()関数に渡すことができる整数です。
L_tmpnam tmpnam()関数 によって生成された一時ファイル名を格納するのに十分な大きさのchar配列のサイズ
ヌル NULL ポインタ定数に展開されるマクロつまり、メモリ内のオブジェクトの有効なアドレスでは ないことが保証されているポインタ値を表す定数です。
SEEK_CUR 現在のファイル位置を基準とした位置決めを要求するために fseek()関数に渡すことができる整数
SEEK_END ファイルの末尾を基準とした相対位置を要求するために fseek()関数に渡すことができる整数
SEEK_SET ファイルの先頭からの相対位置を要求するために 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に対するいくつかの拡張機能が定義されています。その中には、メモリを割り当てるreadline関数、 FILEオブジェクトとファイル記述子間のリンクを確立するfilenoおよびfdopen関数、およびファイルを参照するFILEオブジェクトを作成するための関数グループがあります。インメモリバッファへ。[5]

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

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

int main ( void ) { charバッファ[ 5 ]; FILE * fp = fopen ( "myfile" , "rb" );  
     
        

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

    if ( fread ( buffer , 1 , 5 , fp ) < 5 ) { fputs ( "ファイルの読み取り中にエラーが発生しました。\n " , stderr ); EXIT_FAILUREを返します}       
         
         
    

    fclose ( fp );

    printf ( "読み取られたバイト数: " ); 
for ( int i = 0 ; i < 5 ; ++ i ) { printf ( "%02X " ,バッファ[ i ]); putchar ( '\n' ) ;             
         
    
    

    EXIT_SUCCESSを返します} 

標準入出力の代替

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 仕様p. 274、§7.19。
  2. ^ ブライアン・カーニハン; ロブ、パイク(1984)。UNIX プログラミング環境イングルウッド・クリフプレンティス・ホールp. 200。
  3. ^ マキロイ医師(1987)。Research Unix 読者: プログラマーズ マニュアル、1971 ~ 1986 年(PDF) (技術レポート) からの注釈付きの抜粋。CSTR。ベル研究所。139.
  4. ^ "(stdio.h) - C++ リファレンス". C++ 2021 年7 月 25 日に取得
  5. ^ stdio.h  – 基本定義リファレンス、The Single UNIX 仕様The Open Groupのバージョン 4
  6. ^ "SFIO: 安全で高速な I/O ライブラリ". 2006 年 2 月 11 日のオリジナルからアーカイブ2021 年3 月 16 日に取得{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  7. ^ コーン、デヴィッド G. ; ヴォー、キエムフォン (1991)。SFIO: 安全/高速文字列/ファイル IO手順 夏の USENIX カンファレンス CiteSeerX 10.1.1.51.6574 
  8. ^ ファウラー、グレン S.; コーン、デビッド G. ヴォー、キエムフォン (2000)。Sfio による拡張フォーマット手順 夏の USENIX カンファレンス

外部リンク

  • ウィキメディア・コモンズのCファイル入出力関連メディア
Retrieved from "https://en.wikipedia.org/w/index.php?title=C_file_input/output&oldid=1191741834"