Cファイルの入出力

C言語は、ファイル入出力ための標準ライブラリ 関数を多数提供しています。これらの関数は、C標準ライブラリヘッダー< stdio.h >の大部分を占めています。[1]これらの機能は、 1970年代初頭にベル研究所マイク・レスク氏が作成した「ポータブル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 ファイル名の可能性があります)
開くパイプを作成し、フォークし、シェルを呼び出すことでプロセスを開きます
フリーオープン既存のストリームで別のファイルを開きます
フラッシュ出力ストリームを実際のファイルと同期します
閉じるファイルを閉じる
閉じるストリームを閉じる
セットバッファファイルストリームのバッファを設定します
setvbufファイルストリームのバッファとそのサイズを設定します
広いファイル ストリームをワイド文字 I/O とナロー文字 I/O の間で切り替えます。
直接
入力/出力
読むファイルから読み取る
書き込みファイルに書き込む
フォーマットされていない
入出力
fgetc
getc
fgetwc
getwc
ファイルストリームからバイト/ wchar_tを読み取ります
fgetsfgetwsファイルストリームからバイト/ wchar_t行を読み取ります
fputc
putc
fputwc
putwc
バイト/ wchar_tをファイルストリームに 書き込みます
fputsfputwsバイト/ wchar_t文字列をファイルストリームに 書き込みます。
getchargetwcharstdinからバイト/ wchar_tを読み取ります
取得する改行またはファイル終了に達するまで、stdin からバイト文字列を読み取ります (C99 では非推奨、C11 では削除)
プッチャー置くbyte/ wchar_tをstdoutに 書き込む
置くバイト文字列をstdoutに書き込む
ウンジェクト取得しないバイト/ wchar_tをファイルストリームに戻します
フォーマットされた
入出力
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
標準入力、ファイルストリーム、またはバッファ からフォーマットされたバイト/ wchar_t入力を読み取ります。
vscanf
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
可変引数リストを使用して、stdin、ファイルストリーム、またはバッファ からフォーマットされた入力バイト/ wchar_tを読み取ります。
printf
fprintf
sprintf
snprintf
wprintf
fwprintf
swprintf
フォーマットされたバイト/ wchar_t出力をstdout、ファイルストリーム、またはバッファ に出力します。
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
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_tmpnamtmpnam()関数によって生成された一時ファイル名を格納するのに十分な大きさのchar配列のサイズ
ヌルヌルポインタ定数に展開されるマクロ。つまり、メモリ内のオブジェクトの有効なアドレスではないことが保証されたポインタ値を表す定数。
シーク_CUR現在のファイル位置からの相対的な位置を要求するためにfseek()関数に渡される整数
シーク_エンドファイルの末尾からの相対位置を要求するためにfseek()関数に渡される整数
シークセットファイルの先頭からの相対位置を要求するためにfseek()関数に渡される整数
TMP_MAXtmpnam()関数によって生成できる一意のファイル名の最大数は少なくとも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.txtというバイナリ ファイルを開き、そこから 5 バイトを読み取って、ファイルを閉じます。

#include <stdio.h> #include <stdlib.h>  int main ( void ) { const char FILE_NAME [] = "myfile.txt" ; const int BUFFER_SIZE = 5 ;             char buffer [ BUFFER_SIZE ]; size_t len ; FILE * fp = fopen ( "myfile.txt" , "rb" );         if ( ! fp ) { fprintf ( stderr , "ファイル\" %s \"を開けませんでした!" , FILE_NAME ); return EXIT_FAILURE ; }         if (( len = fread ( buffer , 1 , 5 , fp )) < 0 ) { fclose ( fp ); fprintf ( stderr , "ファイル\" %s \"の読み取り中にエラーが発生しました\n " , FILE_NAME ); return EXIT_FAILURE ; }                 fclose ( fp ); printf ( "読み取られたバイト数: " ); for ( int i = 0 ; i < BUFFER_SIZE ; ++ 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]このライブラリは1997年に外部にリリースされ、最終リリースは2005年2月1日でした。[8]<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.
  • ウィキメディア・コモンズのCファイル入出力関連メディア
「https://en.wikipedia.org/w/index.php?title=C_file_input/output&oldid=1317007070#getchar」から取得