C LANGUAGE TECHNOLOGY

【C言語】fopen/open/fopen_s関数の使い方

悩んでいる人

C言語でファイルを読み書きする方法を教えて!

こういった悩みにお答えします.

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOSの授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校コンピュータサイエンス学部2021年の世界大学学術ランキングで20位)で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発
  • プログラミング歴15年以上,習得している言語: C/C++,Java,Python,Ruby,HTML/CSS/JS/PHP,MATLAB,Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開

こういった私から学べます.

fopen関数

fopen関数は,ファイルを操作するANSI規格の関数です.

第1引数のpathnameで指定された名前のファイルを第2引数のmodeで開き,ストリームと結びつけます.

fopen関数でファイルの読み込み

fopen関数でファイルの読み込みをするコードは以下になります.

実行結果は以下になります.

fopen.cの中身を表示していることがわかります.

fopen関数でファイルの書き込み

fopen関数でファイルの書き込みをするコードは以下になります.

実行結果は以下になります.

3行目のcat output.txtで「fopen2.c」と表示されるので,9行目で定義したSTRが正しく書き込まれていることがわかります.

open関数

open関数は,ファイルのオープンと作成を行うPOSIX.1-2008規格の関数です.

第1引数のpathnameにファイルを指定し,第2引数のflagsにアクセスモードを設定します.

flagsには,アクセスモード O_RDONLY,O_WRONLY,O_RDWRのどれか1つを含まなければなりません.

それぞれ,読み込み専用,書き込み専用,読み書き用にファイルをオープンします.

open関数は,LinuxのGCC/Clangコンパイラで利用できますが,WindowsのVisual Studioで利用できないことに注意して下さい.

open関数は,fopen関数の中で呼び出されます.

fopen関数とは異なり,open関数はバッファがないので,データをすぐに読み書きできます.

fopen関数は標準出力(バッファあり),open関数は標準エラー出力(バッファなし)の関係と似ています.

標準出力と標準エラー出力の違いを知りたいあなたはこちらからどうぞ.

C言語 標準出力 標準エラー出力
【C言語】標準出力と標準エラー出力の違い

こういった悩みにお答えします. こういった私から学べます. 目次1 C言語の標準出力と標準エラー出力の違い1.1 3つの標準ファイルストリーム1.2 標準出力と標準エラー出力のコード2 ファイルストリ ...

続きを見る

open関数でファイルの読み込み

open関数でファイルの読み込みをするコードは以下になります.

実行結果は以下になります.

open.cの中身を表示していることがわかります.

open関数でファイルの書き込み

open関数でファイルの書き込みをするコードは以下になります.

実行結果は以下になります.

3行目のcat output.txtで「open2.c」と表示されるので,13行目で定義したSTRが正しく書き込まれていることがわかります.

fopen_s関数

fopen_s関数は,fopen関数にセキュリティ機能を追加したC11規格の関数です.

fopen関数とは異なり,fopen_s関数は,複数のプログラムから同時に同じファイルをオープンできません(排他モードでオープンします).

排他モードでオープンすることにより,ファイルの中身が処理系定義の動作にならないことが保証されます.

fopen_s関数は,きちんとエラーチェックが出てくれるので,バグが発見しやすくて嬉しいですよね.

fopen_s関数は,WindowsのVisual Studioで利用できますが,LinuxのGCC/Clangコンパイラで利用できないことに注意して下さい.

fopen_s関数とfopen関数のエラー検出の違いは以下になります.

  • fopen_s関数のエラー検出
    • 戻り値のerrno_tが0
    • 第2引数で渡したファイルポインタがNULL
  • fopen関数のエラー検出
    • 戻り値のFILEポインタがNULL

つまり,fopen_s関数は2重でエラー検出ができます.

fopen_s関数でファイルの読み込み

fopen_s関数でファイルの読み込みをするコードは以下になります.

9行目のFILENAMEはあなたの環境で変更して下さい(usernameやファイル名等).

Visual Studioでの実行結果は以下になります.

output.txtの中身「fopen_s.c」を表示できていることがわかります.

fopen_s関数でファイルの書き込み

fopen_s関数でファイルの書き込みをするコードは以下になります.

9行目のFILENAMEはあなたの環境で変更して下さい(usernameやファイル名等).

Visual Studioでの実行結果は以下になります.

同じディレクトリにあるoutput.txtを確認してみると,output.txtの中身が「fopen_s2.c」になっていることがわかります.

まとめ

C言語でfopen/open/fopen_s関数の使い方を紹介しました.

具体的には,fopen/open/fopen_s関数でファイルを読み書きするコードを説明しました.

fopen/open/fopen_s関数の違いをまとめると下表になります.

項目fopen関数open関数fopen_s関数
規格ANSI CPOSIX.1-2008C11
実行可能な開発環境GCC/Clang/Visual StudioGCC/ClangVisual Studio
エラー検出戻り値(ファイルポインタ)戻り値(ファイルディスクリプタ)戻り値(errno_t)
第1引数(ファイルポインタ)
排他モードでオープンできないできないできる

C言語を独学で習得することは難しいです.

私にC言語の無料相談をしたいあなたは,公式LINE「ChishiroのC言語」の友だち追加をお願い致します.

友だち追加

独学が難しいあなたは,C言語を学べるおすすめのオンラインプログラミングスクール3社で自分に合うスクールを見つけましょう.

-C LANGUAGE, TECHNOLOGY
-, , , , , , , , ,