「C言語/ファイル入出力」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
s/機械語/バイナリーデーター/6
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
タグ: 2017年版ソースエディター
2 行
 
== ファイルのオープン ==
まず、ファイルを作成したり読書きしたりするための関数を使うには、
ヘッダー<code><stdio.h></code>をインクルードする。
 
:<syntaxhighlight lang="C">
<code><stdio.h></code>をインクルードしないといけない。
 
下記のような書式になる。
<syntaxhighlight lang="C">
#include <stdio.h>
 
int main() {
FILE *fp = fopen("開きたいファイル名.拡張子", "モード");
{
 
FILE *fp = fopen("開きたいファイル名.拡張子", "モード");
if (fp == 0) return 1;
 
// ここにファイルの操作内容(作成、読み書きなど)を記述。
// ここにファイルの操作内容(作成、読書きなど)を記述。
 
fclose(fp);
return 0;
}
</syntaxhighlight>
: ファイルに読書きなどの操作するためには、まず、そのファイルをオープンする(開く)必要がある。
: オープンされていない状態のファイルは、操作できない。
 
: fopenがファイル操作のためにオープンする関数で、FILE型へのポインタを返すので、変数 <var>fp</var> に保持する。
オープンしていない状態のファイルは、操作できない。
: FILE型へのポインタの型は、
 
:<syntaxhighlight lang="C">
 
FILE *
fopenがファイル操作のためにオープンする関数であるが、これだけではファイル操作をできず、あらかじめFILE型へのポインタを宣言する必要がある。
</syntaxhighlight>
 
: である。
 
FILE型へのポインタの宣言は、
 
<code> FILE *fp; </code>
 
の書式で行う。
 
さて、例えば、
<code> FILE *fp1; </code>
なら、fp1という名のFILE型へのポインタが作成される。
 
 
 
なお Windowsでコードを作る場合、fopen関数が標準設定では禁じられている場合があるので、
 
=== Visual Cで標準入出力関数などを使用する場合 ===
その場合、使用を許可するために、下記のように<code>#pragma warning(disable:4996)</code>を下記のような位置に加える。
Visual Cでは、標準設定ではfopen関数などの標準入出力関数の使用が禁止されており、そのまま上記のコードをコンパイルすると、
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラーC4996’fopen’: This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
のような警告を表示し、コンパイルが完了しない。
 
このような禁止されている関数の使用を許可するために、<code>#pragma warning(disable:4996)</code>を加え、コンパイラの警告を無効化する(メッセージ通り fopen を fopen_s で置換えても良いが、fopen_s を用意している処理系は稀で、GCCもclangもサポートしておらず、環境を選ばずコンパイルするためには #ifdef _MSC_VER などでプリプロセッサーで条件コンパイルする方法があるが、コードの見通しが悪くなる上バッファサイズの計算のケアなどを見落としがちなので、警告を無効化することを選択した)。
<syntaxhighlight lang="C">
// Windowsでfopenが使えない場合
 
;Windowsでfopenを使う場合:<syntaxhighlight lang="C">
#include "stdafx.h"
#include <stdio.h>
53 ⟶ 41行目:
#pragma warning(disable:4996)
 
int main() {
FILE *fp = fopen("開きたいファイル名.拡張子", "モード");
{
FILE *fp = fopen("開きたいファイル名.拡張子", "モード");
// ここにファイルの操作内容(作成、読み書きなど)を記述。
 
if (fp == 0) return 1;
fclose(fp);
 
// ここにファイルの操作内容(作成、読書きなど)を記述。
return 0;
 
fclose(fp);
}
</syntaxhighlight>
 
<code>#pragma warning(disable:4996)</code> が、fopenなどの関数の使用許可への指令するプラグマである。これは、<code>stdafx.h</code> など一連のWindows用ヘッダのインクルードの後に指令する必要がある。
 
{{コラム|Visual Studio で、デバッグ セッションの終了時にコンソールが閉じてしまう場合|
Visual Studio で、コンソール アプリケーションのデバッグ セッションの終了時にコンソールが閉じてしまう場合は、
: [ツール] -> [オプション] -> [デバッグ] -> [デバッグの停止時に自動的にコンソールを閉じる]
を無効にします。
}}
 
実際に;Windows用のファイル操作のコードを書くと、下記のようになる。例:<syntaxhighlight lang="C">
<syntaxhighlight lang="C">
// Windows用のファイル操作のコード例
#include "stdafx.h"
#include <stdio.h>
 
#pragma warning(disable : 4996)
 
int main() {
FILE *fp1 = fopen("test1.txt", "w");
{
if (fp1 == NULL) {
FILE *fp1 = fopen("test1.txt", "w");
perror("ファイルを開けませんでした。\n");
if (fp1 == NULL) {
return 1;
perror("ファイルを開けませんでした。\n");
}
return 1;
}
 
fclose(fp1);
}</syntaxhighlight>
}
</syntaxhighlight>
 
<code>fopen</code> は、モードを "w" で開いた場合、もし対象のファイルが存在しないときは、その名のファイルを新規作成する。
 
<code>fopen</code> は、モードを"w"で開いた場合、もし対象のファイルが存在しないときは、その名のファイルを新規作成する。
 
なお、fopenのモードは、
103 ⟶ 85行目:
がある。
 
なお、一般にファイル操作のプログラミングでは、ファイルのオープンに失敗した場合を想定して、そのような処理を書く必要がある。
::なお、英語で、文字や文章を書くことを write (ライト)という。 wとは、その write の 頭文字w のこと。
::英語で、本や文章を読むことを read (リード)という。 rとは、その read の 頭文字r のこと。
::英語で、追加することを アペンド append という。 aとは、その append の 頭文字a のこと。
 
 
なお、一般にファイル操作のプログラミングでは、安全のために、ファイルのオープンに失敗した場合を想定して、そのような処理を書く必要がある。
 
fclose は、ファイルを閉じる関数である。クローズしている最中のファイルは、プログラミングによる読み書きなどの操作をできない。
 
 
fclose は、ファイルを閉じる関数である。クローズしている最中のファイルは、プログラミングによる読書きなどの操作をできない。
 
読者は、ソースファイルのあるフォルダを確認してみて、"test1.txt"というファイルが作られている事を確認しよう。
 
{{コラム|"stdafx.h"って何?|プログラムの冒頭で<syntaxhighlight lang="C" inline>#include "stdafx.h"</syntaxhighlight> と <code>"stdafx.h"</code> なるヘッダーをインクルードしています。
 
 
ソースファイルのあるフォルダの場所は、Windowsの場合、標準設定では
 
:\ユーザー名\source\repos\プロジェクト名\プロジェクト名
のパスのフォルダにある。
 
VisualStudio 2019 をインストールしたとき、既に source というフォルダのある場合を除けば、普通は インストール時に source という visual studio のプログラミング用のフォルダが自動作成されているので、そこのフォルダを探せばいい。
 
 
さて、このtest1.txtをマウスでクリックして、中身を見ても、まだ何も文章は書き込まれていない事を確認しよう。
 
{{コラム|"stdafx.h"って何?|プログラムの冒頭で<syntaxhighlight lang="C" inline>#include "stdafx.h"</syntaxhighlight> と <code>"stdafx.h"</code> なるヘッダーファイルをインクルードしています。
これはC言語標準にはなく、Windows(Visual Studio)固有のプリコンパイルヘッダーです。stdafx は Standard Application Frameworks の略で、MFC(Microsoft Foundation Class)の使用を想定しているものでした。
VS2019からが、<code>"stdafx.h"</code> から <code>"pch.h"</code>(Pre compile header)と機能と一致した名前になりました。