C言語のファイル処理入門!fopenからfcloseまで基本を徹底解説
ファイル処理(File Handling)とは、プログラムを使ってデータをファイルに保存することです。C言語では、プログラムの実行結果やその他のデータをファイル処理の機能を使ってファイルに保存できます。また、逆にファイルからデータを読み出して、プログラム内で利用することも可能です。
C言語でファイルに対して実行できる主な操作は以下のとおりです。
新しいファイルを作成する
既存のファイルを開く
既存のファイルからデータを読み込む
ファイルへデータを書き込む
ファイル内の特定の位置へ移動する
ファイルを閉じる
fopen()関数でファイルを作成・開く
C言語では、新しいファイルの作成や既存ファイルを開くために fopen() 関数を使用します。この関数は stdio.h ヘッダーファイルで定義されています。
それでは、ファイルを作成または開くための構文を見てみましょう。
file = fopen("file_name", "mode")
これは、C言語でファイルを開く場合にも作成する場合にも共通して使われる構文です。
パラメータ
file_name − fopenメソッドで開く、または作成するファイル名を指定する文字列です。
mode − ファイルをどのようなモードで開くかを指定する文字列(通常は1文字)です。C言語にはさまざまなオープンモードが用意されており、この記事の後半ですべて解説します。
ファイルが新規作成されるのはいつ?
fopen関数は、指定された場所に指定した名前のファイルが存在しない場合に、新しいファイルを作成します。ファイルが見つかった場合は、指定されたモードでそのファイルが開かれます。
具体例で確認してみましょう。fopen関数を使って hello.txt というファイルを開く場合、次のようなステートメントになります。
file = fopen("hello.txt", "w")
これにより、カレントディレクトリ内で hello.txt という名前のファイルが検索されます。ファイルが存在すればそれが開かれ、存在しなければ「hello.txt」という名前の新しいファイルが作成され、書き込みモード("w"で指定)で開かれます。
次に、C言語でファイルを読み書きするために利用できるすべてのモードを、サンプルコードと実行結果とともに順番に見ていきましょう。
モード "r"(読み取り専用)
読み取り用にファイルを開くモードです。このモードではファイルの内容を閲覧することのみ可能で、編集などの他の操作は行えません。
このモードは新しいファイルを作成できず、存在しないファイルを開こうとするとfopen()はNULLを返します。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "r")){
printf("File opened successfully in read mode");
}
else
printf("The file is not present! cannot create a new file using r mode");
fclose(file);
return 0;
}
実行結果
File opened successfully in read mode
カレントディレクトリに hello.txt が存在しているため正常に開かれましたが、存在しない別のファイルにアクセスしようとすると、「The file is not present! cannot create a new file using r mode」という出力になります。
モード "rb"(バイナリ読み取り専用)
バイナリモードで読み取るためにファイルを開くモードです。内容の閲覧のみ可能で、編集などの操作は行えません。
このモードも新しいファイルを作成できず、存在しないファイルを開こうとするとfopen()はNULLを返します。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("program.txt", "rb")){
printf("File opened successfully in read mode");
}
else
printf("The file is not present! cannot create a new file using rb mode");
fclose(file);
return 0;
}
実行結果
The file is not present! cannot create a new file using rb mode
モード "w"(書き込み専用)
書き込み専用でファイルを開くモードです。カレントディレクトリにファイルが存在すればそれを開き、読み取り操作は行えません。ファイルが存在しない場合は、プログラムが新しいファイルを作成して書き込み用に開きます。
なお、テキストが含まれる既存のファイルをこのモードで開くと、内容は上書きされるので注意が必要です。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("helo.txt", "w")){
printf("File opened successfully in write mode or a new file is created");
}
else
printf("Error!");
fclose(file);
return 0;
}
実行結果
File opened successfully in write mode or a new file is created
この例では、ディレクトリに存在しない「helo.txt」を開こうとしていますが、関数は成功メッセージを返しました。これは「helo.txt」という名前の新しいファイルが自動的に作成されたためです。
モード "wb"(バイナリ書き込み専用)
バイナリモードで書き込むためにファイルを開くモードです。カレントディレクトリにファイルが存在すればそれを開き、読み取り操作は行えません。ファイルが存在しない場合は、新しいファイルが作成され、バイナリモードで書き込み用に開かれます。
テキストが含まれる既存ファイルを開いた場合は、内容が上書きされます。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "wb")){
printf("File opened successfully in write in binary mode or a new file is created");
}
else
printf("Error!");
fclose(file);
return 0;
}
実行結果
File opened successfully in write in binary mode or a new file is created
モード "a"(追記専用)
追記(アペンド)専用でファイルを開くモードです。カレントディレクトリにファイルが存在すればそれを開き、読み取り操作は行えません。ファイルが存在しない場合は、新しいファイルが作成され、書き込み用に開かれます。
テキストが含まれる既存ファイルを開いた場合でも内容は上書きされず、既存テキストの末尾に新しいテキストが追加されます。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "a")){
printf("File opened successfully in append mode or a new file is created");
}
else
printf("Error!");
fclose(file);
return 0;
}
実行結果
File opened successfully in append mode or a new file is created
モード "ab"(バイナリ追記専用)
バイナリモードで追記するためにファイルを開くモードです。カレントディレクトリにファイルが存在すればそれを開き、読み取り操作は行えません。ファイルが存在しない場合は、新しいファイルが作成され、バイナリモードで書き込み用に開かれます。
既存ファイルの内容は上書きされず、既存テキストの末尾に新しいテキストが追加されます。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "ab")){
printf("File opened successfully in append in binary mode or a new file is created");
}
else
printf("Error!");
fclose(file);
return 0;
}
実行結果
File opened successfully in append in binary mode or a new file is created
モード "r+"(読み書き両用)
読み取りと書き込みの両方の目的でファイルを開くモードです。つまり、ファイルに対して読み取り操作と書き込み操作の両方が可能です。
このモードは新しいファイルを作成できず、存在しないファイルを開こうとするとfopen()はNULLを返します。また、テキストが含まれるファイルを開いて書き込みを行うと、内容は上書きされます。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "r+")){
printf("File opened successfully in read and write both");
}
else
printf("The file is not present! cannot create a new file using r+ mode");
fclose(file);
return 0;
}
実行結果
File opened successfully in read and write both
カレントディレクトリに hello.txt が存在するため正常に開かれましたが、別の存在しないファイルにアクセスすると、「The file is not present! cannot create a new file using r+ mode」という出力になります。
モード "rb+"(バイナリ読み書き両用)
バイナリモードで読み書きを行うためにファイルを開くモードです。読み取りと書き込みの両方の操作が可能です。
このモードも新しいファイルを作成できず、存在しないファイルを開こうとするとfopen()はNULLを返します。また、テキストが含まれるファイルに書き込みを行うと、内容は上書きされます。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("program.txt", "rb+")){
printf("File opened successfully in read mode");
}
else
printf("The file is not present! cannot create a new file using rb+ mode");
fclose(file);
return 0;
}
実行結果
The file is not present! cannot create a new file using rb+ mode
モード "w+"(読み書き両用・新規作成可)
読み取りと書き込みの両方の操作ができるモードです。カレントディレクトリにファイルが存在すればそれを開き、存在しない場合は新しいファイルを作成して読み書き用に開きます。
テキストが含まれる既存ファイルを開いた場合は、内容が上書きされます。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("helo.txt", "w+")){
printf("File opened successfully in read-write mode or a new file is created");
}
else
printf("Error!");
fclose(file);
return 0;
}
実行結果
File opened successfully in read-write mode or a new file is created
この例でも、存在しない「helo.txt」を開こうとしていますが、新しいファイルが自動的に作成されたため成功メッセージが返されています。
モード "wb+"(バイナリ読み書き両用・新規作成可)
バイナリモードで読み書きを行うためのモードです。カレントディレクトリにファイルが存在すればそれを開き、存在しない場合は新しいファイルを作成してバイナリモードで読み書き用に開きます。
テキストが含まれる既存ファイルを開いた場合は、内容が上書きされます。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "wb+")){
printf("File opened successfully in read-write in binary mode or a new file is created");
}
else
printf("Error!");
fclose(file);
return 0;
}
実行結果
File opened successfully in read-write in binary mode or a new file is created
モード "a+"(読み取り+追記)
読み取りと追記の両方が可能なモードです。カレントディレクトリにファイルが存在すればそれを開き、存在しない場合は新しいファイルを作成して読み書き用に開きます。
テキストが含まれる既存ファイルを開いた場合でも内容は上書きされず、既存テキストの末尾に新しいテキストが追加されます。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "a+")){
printf("File opened successfully in read-append mode or a new file is created");
}
else
printf("Error!");
fclose(file);
return 0;
}
実行結果
File opened successfully in read-append mode or a new file is created
モード "ab+"(バイナリ読み取り+追記)
バイナリモードで読み取りと追記の両方が可能なモードです。カレントディレクトリにファイルが存在すればそれを開き、存在しない場合は新しいファイルを作成してバイナリモードで読み書き用に開きます。
既存ファイルの内容は上書きされず、既存テキストの末尾に新しいテキストが追加されます。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "ab+")){
printf("File opened successfully in read-append in binary mode or a new file is created");
}
else
printf("Error!");
fclose(file);
return 0;
}
実行結果
File opened successfully in read-append mode or a new file is created
既存ファイルからデータを読み込む
C言語では、fscanf()、fgets()、fgetc() の各関数を使ってファイルの内容を読み込むことができます。それぞれの動作を見ていきましょう。
fscanf()関数
fscanf()関数は、ファイルから文字列(文字の集合)を読み込むために使用します。ファイルのすべての内容を読み終えるとEOFを返します。
構文
int fscanf(FILE *stream, const char *charPointer[])
パラメータ
FILE *stream: 開いたファイルへのポインタ。 const char *charPointer[]: 文字列。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
char str[500];
if (file = fopen("hello.txt", "r")){
while(fscanf(file,"%s", str)!=EOF){
printf("%s", str);
}
}
else
printf("Error!");
fclose(file);
return 0;
}
実行結果
LearnprogrammingattutorialsPoint
fgets()関数
C言語のfgets()関数は、ストリームから文字列を読み込むために使用します。
構文
char* fgets(char *string, int length, FILE *stream)
パラメータ
char *string: 読み込んだデータを格納する文字列。 int length: 対象とする文字列の長さを示すint型の値。 FILE *stream: 開いたファイルへのポインタ。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
char str[500];
if (file = fopen("hello.txt", "r")){
printf("%s", fgets(str, 50, file));
}
fclose(file);
return 0;
}
実行結果
Learn programming at tutorials Point
fgetc()関数
C言語のfgetc()関数は、ファイルから1文字を取得して返すために使用します。ファイルから1文字ずつ読み込み、ファイルの終端に達するとEOFを返します。
構文
char* fgetc(FILE *stream)
パラメータ
FILE *stream: 開いたファイルへのポインタ。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
char str;
if (file = fopen("hello.txt", "r")){
while((str=fgetc(file))!=EOF)
printf("%c",str);
}
fclose(file);
return 0;
}
実行結果
Learn programming at tutorials Point
C言語でファイルへデータを書き込む
C言語では、fprintf()、fputs()、fputc() の各関数を使ってファイルにデータを書き込むことができます。それぞれの動作を見ていきましょう。
fprintf()関数
fprintf()関数は、ファイルにデータを書き込むために使用します。一連の文字をファイルに書き出します。
構文
int fprintf(FILE *stream, char *string[])
パラメータ
FILE *stream: 開いたファイルへのポインタ。 char *string[]: ファイルに書き込みたい文字配列。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "w")){
if(fprintf(file, "tutorials Point") >= 0)
printf("Write operation successful");
}
fclose(file);
return 0;
}
実行結果
Write operation successful
fputs()関数
C言語のfputs()関数は、ファイルへの書き込みに使用できます。1行分の文字列をファイルに書き込む際に使われます。
構文
int fputs(const char *string, FILE *stream)
パラメータ
const char *string[]: ファイルに書き込みたい文字配列。 FILE *stream: 開いたファイルへのポインタ。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "w")){
if(fputs("tutorials Point", file) >= 0)
printf("String written to the file successfully...");
}
fclose(file);
return 0;
}
実行結果
String written to the file successfully…
fputc()関数
fputc()関数は、ファイルに1文字だけ書き込むために使用します。
構文
int fputc(char character , FILE *stream)
パラメータ
char character: ファイルに書き込みたい1文字。 FILE *stream: 開いたファイルへのポインタ。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
if (file = fopen("hello.txt", "w")){
fputc('T', file);
}
fclose(file);
return 0;
}
実行結果
'T' is written to the file.
fclose()関数
fclose()関数は、開いているファイルを閉じるために使用します。ファイルに対する操作を行った後は、変更内容を確実に保存するために必ずファイルを閉じるようにしましょう。
構文
fclose(FILE *stream)
パラメータ
FILE *stream: 開いたファイルへのポインタ。
サンプルコード
#include <stdio.h>
int main(){
FILE * file;
char string[300];
if (file = fopen("hello.txt", "a+")){
while(fscanf(file,"%s", string)!=EOF){
printf("%s", string);
}
fputs("Hello", file);
}
fclose(file);
return 0;
}
実行結果
LearnprogrammingatTutorialsPoint
処理後のファイル内容
Learn programming at Tutorials PointHello
このように、a+モードで開いたファイルに対して既存の内容を読み込んだ後、fputs()で「Hello」を追記し、fclose()でファイルを閉じて変更を保存しています。ファイル操作の最後には必ずfclose()を呼び出すことが、安全なC言語プログラミングの基本です。
-
C++の例外処理入門!try・catch・throwの基本と標準例外クラス一覧
C++における例外処理(Exception Handling)とは、プログラムの実行時に発生するエラー(ランタイムエラー)を適切に扱うための仕組みです。例外とは、実行時に送出(スロー)されるイベントのことで、C++ではすべての標準例外が std::exception クラスから派生しています。もし例外を捕捉しなかった場合、例外メッセージが出力され、プログラムは強制終了してしまいます。 C++標準では、例外関連のクラスが <exception> ヘッダに定義されており、プログラムの中で自由に利用できます。親子関係によるクラス階層は次のようになっています。 C++の主な標準例外クラス
-
Pythonでファイルのパーミッション(アクセス権)を変更する方法
Pythonでファイルのパーミッション(アクセス権)を変更するには、標準ライブラリの os.chmod(ファイル名, モード) を使用します。モードは8進数で指定する必要があるため、数値の先頭に必ず 0o を付けて記述してください。os.chmod()を使った基本的な変更方法例えば、すべてのユーザーに対して読み込み・書き込み・実行の全権限を与えたい場合は、パーミッションを 0o777 に設定します。以下のように記述します。>>> import os>>> os.chmod(my_file, 0o777)statモジュールのフラグを使う方法また、stat モジ