C言語のファイル操作入門|オープンモード一覧とファイルコピーのサンプルコード
C言語で行えるファイル操作の一覧
C言語では、ファイルに対して次のような基本的な操作を行うことができます。
- ファイル名の指定
- ファイルを開く(オープン)
- ファイルからデータを読み込む
- ファイルへデータを書き込む
- ファイルを閉じる(クローズ)
ファイルを開く基本構文
ファイルポインタの宣言は以下のように行います。
FILE *ファイルポインタ;
例:
FILE *fptr;
続いて、fopen関数を使ってファイルを開き、ファイルポインタに関連付けます。書式は次の通りです。
ファイルポインタ = fopen("ファイル名", "モード");
例:
FILE *fp;
fp = fopen("sample.txt", "w");
ファイルのオープンモード一覧
fopen関数には、用途に応じてさまざまなモードを指定できます。主なモードは以下の表の通りです。
| モード | 説明 |
|---|---|
| r | 読み込み用としてファイルを開く |
| w | 書き込み用としてファイルを開く |
| a | 追記(アペンド)用としてファイルを開く |
| r+ | 読み書き両用としてファイルを開く |
| w+ | 読み書き両用(先頭から上書き)としてファイルを開く |
| a+ | 追記・読み込み両用としてファイルを開く |
| rt | テキストファイルを読み込み用として開く |
| wt | テキストファイルを書き込み用として開く |
| at | テキストファイルを追記用として開く |
| r+t | テキストファイルを読み書き両用として開く |
| w+t | テキストファイルを読み書き両用として開く |
| a+t | テキストファイルを追記・読み込み両用として開く |
| rb | バイナリファイルを読み込み用として開く |
| wb | バイナリファイルを書き込み用として開く |
| ab | バイナリファイルを追記用として開く |
| r+b | バイナリファイルを読み書き両用として開く |
| w+b | バイナリファイルを読み書き両用として開く |
| a+b | バイナリファイルを追記・読み込み両用として開く |
書き込みモード("w")の場合
FILE *fp;
fp = fopen("sample.txt", "w");
- ファイルが存在しない場合:新しいファイルが自動的に作成されます。
- ファイルが既に存在する場合:以前の内容はすべて消去され、新しく書き込んだ内容だけが保存されます。
読み込みモード("r")の場合
FILE *fp;
fp = fopen("sample.txt", "r");
- ファイルが存在しない場合:fopen関数はNULLを返します。
- ファイルが存在する場合:正常にファイルからデータを読み込めます。
追記モード("a")の場合
FILE *fp;
fp = fopen("sample.txt", "a");
- ファイルが存在しない場合:新しいファイルが作成されます。
- ファイルが存在する場合:既存の内容の末尾に新しい内容が追加されます。
モードごとの動作まとめ
| モード | ファイルが存在する場合 | ファイルが存在しない場合 |
|---|---|---|
| r | 読み込み | fp = NULL |
| w | 既存内容を消去して新規書き込み | 新規ファイルを作成 |
| a | 既存内容の末尾に追記 | 新規ファイルを作成 |
サンプルプログラム:ファイルのコピー
以下は、あるファイルの内容を別のファイルへコピーするC言語のプログラムです。
// あるファイルの内容を別のファイルにコピーするプログラム
#include <stdio.h>
#include <stdlib.h> // exit() のため
int main(){
FILE *fptr1, *fptr2;
char filename[100], c;
printf("読み込み用のファイル名を入力してください\n");
scanf("%s", filename);
// 1つ目のファイルを読み込みモードで開く
fptr1 = fopen(filename, "r");
if (fptr1 == NULL){
printf("%s を開けません\n", filename);
exit(0);
}
printf("書き込み用のファイル名を入力してください\n");
scanf("%s", filename);
// 別のファイルを書き込みモードで開く
fptr2 = fopen(filename, "w");
if (fptr2 == NULL){
printf("%s を開けません\n", filename);
exit(0);
}
// 元ファイルから1文字ずつ読み取り、書き込み
c = fgetc(fptr1);
while (c != EOF){
fputc(c, fptr2);
c = fgetc(fptr1);
}
printf("\n%s に内容をコピーしました", filename);
fclose(fptr1);
fclose(fptr2);
return 0;
}
実行結果
このプログラムを実行すると、次のような出力が得られます。
読み込み用のファイル名を入力してください
file2.txt
書き込み用のファイル名を入力してください
file1.txt
file1.txt に内容をコピーしました
-
C言語のシフト演算とは?左シフト・右シフト・補数の基本をわかりやすく解説
問題 C言語を使用して、ある数値に対する左シフト・右シフト・補数(ビット反転)を求める簡単なプログラムを作成するには、どのようにすればよいのでしょうか。 解決方法 左シフト(<<) 変数の値を1ビットだけ左へシフトすると、その値は2倍になります。「a × 2」を計算したのと同じ結果です。 例:a = 10 の場合、a << 1 = 20 右シフト(>>) 変数の値を1ビットだけ右へシフトすると、その値は元の半分になります。「a ÷ 2」の整数除算と同じ結果です。 例:a = 10 の場合、a >> 1 = 5 サンプルプログラム 以下は、シ
-
C言語の探索アルゴリズム解説|線形探索と二分探索の違いと実装例
探索(サーチ)とは、複数の要素で構成されるリストの中から、目的の「キー」となる要素を見つけ出す処理のことです。 リストの中に指定した要素が存在すれば、その探索は「成功」とみなされます。 指定した要素がリストに存在しなければ、その探索は「失敗(不成功)」となります。 C言語で広く使われている代表的な探索手法は、主に次の2つです。 線形探索(Linear Search/リニアサーチ) 二分探索(Binary Search/バイナリサーチ) 線形探索(Linear Search)とは 線形探索は、リストの先頭から順に要素を1つずつ取り出し、キーと一致するかどうかを確認していく、最も基本的な探