Cファイルの入出力

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

Cプログラミング言語は、ファイルの入出力用に多くの標準ライブラリ 関数を提供します。これらの関数は、C標準ライブラリヘッダー<stdio.h>の大部分を構成します。[1]この機能は、1970年代初頭にベル研究所でMikeLeskによって作成された「ポータブル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 )で定義されています。

バイト
文字
ワイド
文字
説明
ファイルアクセス fopen ファイルを開きます(WindowsではUnicode以外のファイル名、LinuxではUTF-8ファイル名の可能性があります)
freopen 既存のストリームで別のファイルを開きます
フラッシュ 出力ストリームを実際のファイルと同期します
fclose ファイルを閉じます
setbuf ファイルストリームのバッファを設定します
setvbuf ファイルストリームのバッファとそのサイズを設定します
fwide ファイルストリームをワイド文字I/Oとナロー文字I/Oの間で切り替えます
直接
入力/出力
フレッド ファイルから読み取ります
fwrite ファイルに書き込む
フォーマットされていない
入力/出力
fgetc
getc
fgetwc
getwc
ファイルストリームから byte/ wchar_tを読み取ります
fgets fgetws ファイルストリームから byte/ wchar_t行を読み取ります
fputc
putc
fputwc
putwc
バイト/ wchar_tをファイルストリームに 書き込みます
fputs fputws バイト/ wchar_t文字列をファイルストリームに 書き込みます
getchar getwchar stdinから バイト/ wchar_tを読み取ります
取得 改行またはファイルの終わりが検出されるまで、stdinからバイト文字列を読み取ります(C99で非推奨、C11から削除)
putchar putwchar バイト/ wchar_tをstdoutに 書き込みます
置く stdoutにバイト文字列を書き込みます
ungetc ungetwc バイト/ wchar_tをファイルストリームに戻します
フォーマットされた
入力/出力
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
stdin、ファイルストリーム、またはバッファ からフォーマットされたバイト/ wchar_t入力を読み取ります
vscanf
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
可変引数リストを使用して、stdin、ファイルストリーム、またはバッファ からフォーマットされた入力バイト/ 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 ファイル位置インジケータをファイル内の特定の場所に移動します
巻き戻し ファイル位置インジケーターをファイルの先頭に移動します
エラー
処理
clearerr エラーをクリアします
feof ファイルの終わりをチェックします
恐怖 ファイルエラーをチェックします

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

定数

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

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

変数

Stdstreams-notitle.svg

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

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

メンバータイプ

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

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

拡張機能

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

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

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

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

    if fp == NULL {    
        perror "ファイル\" myfile \ " "を開くことができませんでした);
        EXIT_FAILUREを返します; 
    }

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

    fclose fp );

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

    EXIT_SUCCESSを返します; 
}

stdioの代替

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

他の選択肢には、AT&Tベル研究所のSFIO [6](安全/高速I / Oライブラリ)ライブラリが含まれます。1991年に導入されたこのライブラリは、 stdioの設計における矛盾、安全でない慣行、および非効率性を回避することを目的としていますその機能の中には、コールバック関数をストリームに挿入して、ストリームから読み取られた、またはストリームに書き込まれたデータの処理をカスタマイズする可能性があります。[7] 1997年に外界にリリースされ、最後のリリースは2005年2月1日でした。[8]

も参照してください

参考文献

  1. ^ ISO / IEC 9899:1999仕様 (PDF)p。274、§7.19。
  2. ^ カーニハン、ブライアン; パイク、ロブ(1984)。UNIXプログラミング環境イングルウッドクリフプレンティスホールp。200。
  3. ^ McIlroy、MD(1987)。Research Unixリーダー:プログラマーマニュアル、1971年から1986年(PDF)(テクニカルレポート)からの注釈付きの抜粋。CSTR。ベル研究所。139。
  4. ^ "(stdio.h)-C++リファレンス"
  5. ^ stdio.h  –基本定義リファレンス、 Single UNIX Specification、TheOpenGroupのバージョン4
  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会議 CiteSeerX10.1.1.51.6574_ 
  8. ^ ファウラー、グレンS .; コーン、デビッドG .; Vo、Kiem-Phong(2000)。Sfioによる拡張フォーマット手順 夏のUSENIX会議

外部リンク