C LANGUAGE TECHNOLOGY

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

2021年6月23日

悩んでいる人
悩んでいる人

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

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

本記事の信頼性

  • リアルタイムシステムの研究歴12年.
  • 東大教員の時に,英語でOS(Linuxカーネル)の授業.
  • 2012年9月~2013年8月にアメリカのノースカロライナ大学チャペルヒル校(UNC)コンピュータサイエンス学部で客員研究員として勤務.C言語でリアルタイムLinuxの研究開発.
  • プログラミング歴15年以上,習得している言語: C/C++PythonSolidity/Vyper,Java,Ruby,Go,Rust,D,HTML/CSS/JS/PHP,MATLAB,Verse(UEFN), Assembler (x64,ARM).
  • 東大教員の時に,C++言語で開発した「LLVMコンパイラの拡張」,C言語で開発した独自のリアルタイムOS「Mcube Kernel」GitHubにオープンソースとして公開
  • 2020年1月~現在はアメリカのノースカロライナ州チャペルヒルにあるGuarantee Happiness LLCのCTOとしてECサイト開発やWeb/SNSマーケティングの業務.2022年6月~現在はアメリカのノースカロライナ州チャペルヒルにあるJapanese Tar Heel, Inc.のCEO兼CTO.
  • 最近は自然言語処理AIイーサリアムに関する有益な情報発信に従事.
    • (AI全般を含む)自然言語処理AIの論文の日本語訳や,AIチャットボット(ChatGPT,Auto-GPT,Gemini(旧Bard)など)の記事を50本以上執筆.アメリカのサンフランシスコ(広義のシリコンバレー)の会社でプロンプトエンジニア・マネージャー・Quality Assurance(QA)の業務委託の経験あり.
    • (スマートコントラクトのプログラミングを含む)イーサリアムや仮想通貨全般の記事を200本以上執筆.イギリスのロンドンの会社で仮想通貨の英語の記事を日本語に翻訳する業務委託の経験あり.

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

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

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

私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!

友だち追加

独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

fopen関数

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

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

fclose関数は,streamが指すストリームを(バッファーリングされて いた全ての出力データをfflush関数を用いて書き込んで)フラッシュし,対応するファイルディスクリプタをクローズする関数です.

fopen関数とペアで利用します.

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コンパイラで利用できますが,Visual Studioで利用できないことに注意して下さい.

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

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

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

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

close関数は,ファイルディスクリプタfdをクローズする関数です.

open関数とペアで利用します.

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関数と同様に,fopen_s関数でオープンしたファイルをクローズする時は,fclose関数を利用します.

また,fopen_s関数は,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引数(ファイルポインタ)
排他モードでオープンできないできないできる
クローズする時に使う関数fclose関数close関数fclose関数

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

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

私のキャパシティもあり,一定数に達したら終了しますので,今すぐ追加しましょう!

友だち追加

独学が難しいあなたは,元東大教員がおすすめするC言語を学べるオンラインプログラミングスクール5社で自分に合うスクールを見つけましょう.後悔はさせません!

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