トップQs
タイムライン
チャット
視点

C言語の標準入出力

ウィキペディアから

Remove ads

本記事C言語の標準入出力(シーげんごのひょうじゅんにゅうしゅつりょく)では、C言語で提供される、ファイル入出力用の、標準Cライブラリヘッダ <stdio.h>[1] の大部分を構成する標準Cライブラリ関数について述べる。これらの機能は、1970年代初頭[2]ベル研究所マイク・レスク英語版によって書かれた、「ポータブルI/Oパッケージ」に由来し、正式にVersion 7 UnixUnixオペレーティングシステムの一部になった[3]

C言語の標準入出力機能は、現代使われるプログラミング言語の中ではかなり貧弱であり、すべてのファイル操作をバイトストリーム (「入力ストリーム」あるいは「出力ストリーム」) の操作に抽象化する。C言語以前のプログラミング言語とは異なり、C言語はランダムアクセスを直接サポートしていない。ファイルの途中から読み取るには、プログラマは、ストリームを作成し、ファイルの途中へシークし、ストリームからバイトを順番に読み取らなければならない。

ファイル入出力のストリームモデルは、C言語とほぼ同時に開発されたUnixによって普及した。最近のオペレーティングシステムの大部分はUnixのストリームモデルを継承している。また、C言語の影響を受けた多くの言語はC言語のファイル入出力インターフェイスを継承しており、差異はほぼ存在しない (例: PHP)。

Remove ads

概要

要約
視点

C言語の標準入出力機能は、ストリームと呼ばれるオブジェクトを使用して、キーボード、プリンタ、端末などの物理デバイス、またはシステムでサポートされている他の種類のファイルを操作する。ストリームは、これらのデバイスを 同じ操作で操作するための抽象化に利用される。すなわち、すべてのストリームは、関連付けられている物理デバイスの差異に関係なく、同様のプロパティを持つ[4]

関数

ほとんどのC言語入出力関数は、stdio.h (または、C++の場合 cstdio 上の std 名前空間) に定義されている。

さらに見る 機能, バイト 文字 ...

定数

stdio.h で定義されている定数は次の通りである。

さらに見る 定数名, 説明 ...

変数

stdio.h で定義されている変数は次の通りである。

さらに見る 名前, 説明 ...

データ型

stdio.h で定義されているデータ型は次の通りである。

  • FILE – ファイルハンドルとしても知られている。入出力操作を実行するために必要な以下のようなファイルまたはテキストストリームに関する情報を保持しているプログラマから隠蔽された型である。
    • ファイル記述子など、関連する入出力デバイスのプラットフォーム固有の識別子
    • バッファ
    • ストリームの方向の状態
    • バッファ状態
    • 入出力状態
    • モード (バイナリもしくはテキスト)
    • EOF状態
    • エラー状態
    • 現在位置とマルチバイト変換状態
    • 再入可能ロック (C11では必須)
  • fpos_t – ファイル内の位置を表す型
  • size_tsizeof 演算子の結果の型であり、符号なし整数型

拡張機能

POSIX標準では、stdio に拡張を定義している。それによって、readline 関数を使用してメモリを自動で割り当てること、fileno 関数と fdopen 関数を使用して、FILE 型とファイル記述子を接続すること、メモリ上を参照するFILE型の参照を作成することが可能になる[5]

Remove ads

以下のCプログラムでは、 hogefile というバイナリファイルを開き、5バイト読み取り、ファイルを閉じている。

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

int main(void) {
    char buffer[5];
    FILE* fp = fopen("hogefile", "rb");

    if (fp == NULL) {
        perror("\"hogefile\"を開けませんでした。");
        return EXIT_FAILURE;
    }

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

    fclose(fp);

    printf("読み取ったバイト列: %x %x %x %x %x\n", buffer[0], buffer[1],
        buffer[2], buffer[3], buffer[4]);

    return EXIT_SUCCESS;
}
Remove ads

stdioの代替

stdio の代替がいくつか開発されている。これらの中には、ISO C++標準の一部である iostream ライブラリがある。

他には、ベル研究所が開発しているSfio (Safe-fast / string-file I/O) ライブラリがある。1991年に開発されたこのライブラリは、stdio の設計における矛盾、危険な慣行、非効率性を回避することを目的にしている。特徴として、コールバック関数を導入してストリームに対して読み書きを行い、より柔軟にデータ処理を行うことを可能とすることが挙げられる[6]。1997年に外部に公開された[7]

関連項目

脚注

外部リンク

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads