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ファイル名が可能です)
popenパイプを作成し、フォークし、シェルを呼び出すことでプロセスを開きます
freopen既存のストリームで別のファイルを開きます
fflush出力ストリームを実際のファイルと同期します
fcloseファイルを閉じる
pcloseストリームを閉じる
setbufファイルストリームのバッファを設定します
setvbufファイルストリームのバッファとそのサイズを設定します
fwideファイルストリームをワイド文字I/Oとナロー文字I/Oの間で切り替えます
直接
入力/出力
freadファイルから読み込む
fwriteファイルへ書き込む
フォーマットされていない
入出力
fgetc
getc
fgetwc
getwc
ファイルストリームからbyte/ wchar_tを読み取ります
fgetsfgetwsファイルストリームからbyte/ wchar_t行を読み取ります
fputc
putc
fputwc
putwc
ファイルストリームにbyte/ wchar_tを書き込みます
fputsfputwsbyte/ wchar_t文字列をファイルストリームに 書き込みます
getchargetwchar標準入力からバイト/ wchar_tを読み取ります
取得改行またはファイル終了に達するまで、stdinからバイト文字列を読み取ります(C99では非推奨、C11では削除)
putcharputwcharbyte/ wchar_tを標準出力に 書き込みます
putsバイト文字列を標準出力に書き込みます
ungetcungetwcバイト/ 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
フォーマットされたバイト/ wchar_t出力をstdout、ファイルストリーム、またはバッファ に出力します。
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
可変引数リストを使用して、フォーマットされたバイト/ wchar_t出力をstdout、ファイルストリーム、またはバッファ に出力します。
perror現在のエラーの説明をstderrに 書き込みます
ファイルの位置指定ftell
ftello
現在のファイル位置インジケータを返します
fseek
fseeko
ファイル位置インジケータをファイル内の特定の位置に移動します
fgetposファイル位置インジケータを取得します
fsetposファイル位置インジケータをファイル内の特定の位置に移動します
巻き戻しファイル位置インジケータをファイルの先頭に移動する
エラー
処理
クリアエラーをクリアします
feofファイルの終わりをチェックする
ferrorファイルエラーをチェックします

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

定数

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

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

変数

ヘッダーで定義される変数には<stdio.h>以下が含まれます

名前注記
標準入力標準入力ストリーム(通常はキーボード)を参照するFILEへのポインタ
標準出力標準出力ストリーム(通常はディスプレイ端末)を参照するFILEへのポインタ
stderr標準エラーストリーム(多くの場合、ディスプレイ端末)を参照する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#Overview_of_functions」より取得