C でのファイル処理の基本

C におけるファイル処理は、ファイルの作成、オープン、読み取り、書き込み、およびクローズ操作を行うプロセスです。 C 言語は、プログラム内で入力、出力、およびさまざまな C ファイル操作を実行するために、fopen()、fwrite()、fread()、fseek()、fprintf() などのさまざまな関数を提供します。

なぜ C でファイル処理が必要なのでしょうか?

これまでのところ、C プログラムを使用した操作は、どこにも保存されていないプロンプト/ターミナル上で実行されます。プログラムを閉じると出力は削除されます。しかし、ソフトウェア業界では、ほとんどのプログラムは、プログラムから取得した情報を保存するように作成されています。ファイル処理の使用は、まさに状況に応じて必要とされるものです。

ファイル処理がなぜ重要なのかを理解するために、ファイル使用のいくつかの機能を見てみましょう。

  • 再利用性: ファイルに保存されたデータは、いつでもどこでもアクセス、更新、削除が可能で、再利用性が高くなります。
  • 携帯性: データを失うことなく、ファイルを別のファイルに転送できます。 コンピュータシステム内で。この機能により、欠陥のあるコーディングのリスクが最小限に抑えられます。
  • 効率的: プログラムによっては、大量の入力が必要になる場合があります。ファイル処理を使用すると、少数の命令を使用してファイルの一部に簡単にアクセスできるため、時間を大幅に節約し、エラーの可能性を減らすことができます。
  • ストレージ容量: ファイルを使用すると、プログラムにすべてを同時に保存することを心配することなく、大量のデータを保存できます。

C のファイルの種類

ファイルは、データを保存する方法に基づいて 2 つのタイプに分類できます。それらは次のとおりです。

  • テキストファイル
  • バイナリファイル

1. テキストファイル

テキスト ファイルにはデータが含まれています。 ASCII 文字の形式 通常、文字のストリームを保存するために使用されます。

  • テキスト ファイルの各行は改行文字 (「 」) で終わります。
  • 任意のテキスト エディタで読み書きできます。
  • 通常、これらは次のように保存されます。 。TXT ファイル拡張子。
  • テキスト ファイルを使用してソース コードを保存することもできます。

2. バイナリファイル

バイナリ ファイルには次のデータが含まれています バイナリ形式 (つまり、0 と 1) ASCII 文字の代わりに。これらには、メイン メモリに格納される方法と同様の方法で格納されたデータが含まれています。

  • バイナリ ファイルはプログラム内からのみ作成でき、その内容はプログラムからのみ読み取ることができます。
  • 簡単には読み取れないため、より安全です。
  • 通常、これらは次のように保存されます。 。置き場 ファイル拡張子。

C ファイル操作

C ファイル操作とは、C でファイルに対して実行できる次のようなさまざまな操作を指します。

  1. 新しいファイルの作成 – a または a+ または w または w+ としての属性を持つ fopen()
  2. 既存のファイルを開く – fopen()
  3. ファイルからの読み取り – fscanf() または fgets()
  4. ファイルへの書き込み – fprintf() または fputs()
  5. ファイル内の特定の場所に移動 – fseek() 、巻き戻し()
  6. ファイルを閉じる – fclose()

強調表示されたテキストは、ファイル操作を実行するために使用される C 関数について言及しています。

C ファイル操作の関数

Cでのファイル処理

C のファイル ポインター

ファイル ポインタは、開かれたファイル内の特定の位置への参照です。これは、読み取り、書き込み、閉じるなどのすべてのファイル操作を実行するファイル処理で使用されます。 ファイル ファイルポインタ変数を宣言するマクロ。 FILEマクロは内部で定義されています ヘッダファイル。

ファイルポインタの構文

  FILE*     pointer_name  ; 

ファイル ポインタは、C のほぼすべてのファイル操作で使用されます。

C でファイルを開く

C でファイルを開く場合、 fopen() 関数は、必要なアクセス モードとともにファイル名またはファイル パスとともに使用されます。

fopen() の構文

FILE*   fopen  (const char *  file_name  , const char *  access_mode  ); 

パラメーター

  • ファイル名 : ソース ファイルと同じディレクトリに存在する場合のファイルの名前。それ以外の場合はフルパス。
  • アクセスモード: ファイルを開く操作を指定します。

戻り値

  • ファイルが正常に開かれた場合は、そのファイルへのファイル ポインタを返します。
  • ファイルが開かれていない場合は、NULL を返します。

C のファイルを開くモード

ファイルを開くモードまたはアクセス モードは、開くファイルに対して許可される操作を指定します。これらは引数として fopen() 関数に渡されます。一般的に使用されるファイル アクセス モードの一部を以下に示します。

オープニングモード 説明
r ファイルを検索します。ファイルが正常に開かれると、 fopen( ) はそのファイルをメモリにロードし、そのファイル内の最初の文字を指すポインタを設定します。ファイルを開けない場合、fopen( ) は NULL を返します。
RB バイナリ モードで読み取り用に開きます。ファイルが存在しない場合、fopen( ) は NULL を返します。
テキストモードで書き込み用に開きます。ファイルが存在する場合、その内容は上書きされます。ファイルが存在しない場合は、新しいファイルが作成されます。ファイルを開けない場合は NULL を返します。
wb バイナリ モードで書き込み用に開きます。ファイルが存在する場合、その内容は上書きされます。ファイルが存在しない場合は作成されます。
ある ファイルを検索します。ファイルが正常に開かれると、 fopen( ) はファイルをメモリにロードし、ファイル内の最後の文字を指すポインタを設定します。追加モードでのみ開きます。ファイルが存在しない場合は、新しいファイルが作成されます。ファイルを開けない場合は NULL を返します。
腹筋 バイナリ モードで追加用に開きます。データはファイルの最後に追加されます。ファイルが存在しない場合は作成されます。
r+ ファイルを検索します。これは正常に開かれます。 fopen( ) はそれをメモリにロードし、その中の最初の文字を指すポインタを設定します。ファイルを開けない場合は NULL を返します。
RB+ バイナリ モードで読み取りと書き込みの両方のためにオープンします。ファイルが存在しない場合、fopen( ) は NULL を返します。
w+ ファイルを検索します。ファイルが存在する場合、その内容は上書きされます。ファイルが存在しない場合は、新しいファイルが作成されます。ファイルを開けない場合は NULL を返します。
wb+ バイナリ モードで読み取りと書き込みの両方のためにオープンします。ファイルが存在する場合、その内容は上書きされます。ファイルが存在しない場合は作成されます。
α+ ファイルを検索します。ファイルが正常に開かれると、 fopen( ) はファイルをメモリにロードし、ファイル内の最後の文字を指すポインタを設定します。ファイルは読み取りモードと追加モードの両方で開きます。ファイルが存在しない場合は、新しいファイルが作成されます。ファイルを開けない場合は NULL を返します。
腹部+ バイナリ モードで読み取りと追加の両方のために開きます。ファイルが存在しない場合は作成されます。

上で述べたように、バイナリ ファイルに対して操作を実行する場合は、最後に「b」を追加する必要があります。たとえば、w の代わりに wb を使用する必要があり、a+ の代わりに a+b を使用する必要があります。

ファイルを開く例

C




// C Program to illustrate file opening> #include> #include> int> main()> {> > // file pointer variable to store the value returned by> > // fopen> > FILE> * fptr;> > // opening the file in read mode> > fptr => fopen> (> 'filename.txt'> ,> 'r'> );> > // checking if the file is opened successfully> > if> (fptr == NULL) {> > printf> (> 'The file is not opened. The program will '> > 'now exit.'> );> > exit> (0);> > }> > return> 0;> }>

出力

The file is not opened. The program will now exit. 

ファイルはソース ディレクトリに存在しないため、開かれません。ただし、 fopen() 関数は、ファイルが存在しない場合にファイルを作成することもできます。以下に示します

C でファイルを作成する

fopen() 関数は、ファイルを開くだけでなく、ファイルがまだ存在しない場合は作成することもできます。そのためには、w、w+、wb、wb+、a、a+、ab、ab+ など、ファイルが見つからない場合にファイルを作成できるモードを使用する必要があります。

FILE *fptr; fptr =   fopen  ('  filename.txt  ', '  w  '); 

ファイルを開く例

C




// C Program to create a file> #include> #include> int> main()> {> > // file pointer> > FILE> * fptr;> > // creating file using fopen() access mode 'w'> > fptr => fopen> (> 'file.txt'> ,> 'w'> );> > // checking if the file is created> > if> (fptr == NULL) {> > printf> (> 'The file is not opened. The program will '> > 'exit now'> );> > exit> (0);> > }> > else> {> > printf> (> 'The file is created Successfully.'> );> > }> > > return> 0;> }>

出力

The file is created Successfully. 

ファイルからの読み取り

C でのファイル読み取り操作は、関数 fscanf() または fgets() を使用して実行できます。どちらの関数も、scanf および gets と同じ操作を実行しましたが、追加のパラメーターであるファイル ポインターが使用されていました。ファイルから読み取るために使用できる他の関数もあります。そのような関数を以下に示します。

関数 説明
fscanf() フォーマットされた文字列と可変引数リストを使用して、ファイルから入力を取得します。
fgets() ファイルの行全体を入力します。
fgetc() ファイルから 1 文字を読み取ります。
得る() ファイルから数値を読み取ります。
フレッド() バイナリ ファイルから指定されたバイトのデータを読み取ります。

したがって、ファイルを 1 行ずつ読み取るか、1 文字ずつ読み取るかは、ユーザー次第です。

例:

FILE * fptr;  fptr = fopen(fileName.txt, r); fscanf(fptr, '%s %s %s %d', str1, str2, str3, &year); char c = fgetc(fptr); 

getc() およびその他のファイル読み取り関数は、読み取り中にファイルの終わりに到達すると EOF (End Of File) を返します。 EOF はファイルの終わりを示し、その値は実装で定義されます。

注記: ここで注意すべき点は、ファイルの特定の部分を読み取った後、ファイル ポインタが最後に読み取られた文字の末尾に自動的に移動されることです。

ファイルに書き込む

ファイル書き込み操作は、読み取り操作と同様の関数 fprintf() および fputs() によって実行できます。 C プログラミングでは、ファイルにデータを書き込むために使用できる次のような他の関数も提供します。

関数 説明
fprintf() printf() と同様に、この関数はフォーマットされた文字列と変数引数リストを使用して出力をファイルに出力します。
fputs() ファイル内の行全体と末尾の改行を出力します。
fputc() 単一の文字をファイルに出力します。
fputw() ファイルに数値を出力します。
fwrite() この関数は、指定されたバイト量をバイナリ ファイルに書き込みます。

例:

FILE *fptr ;  fptr = fopen(fileName.txt, w); fprintf(fptr, '%s %s %s %d', 'We', 'are', 'in', 2012); fputc('a', fptr); 

ファイルを閉じる

fclose() 関数は、ファイルを閉じるために使用されます。ファイル操作が成功した後は、必ずファイルを閉じてメモリから削除する必要があります。

fclose() の構文

  fclose  (  file_pointer  ); 

どこ ファイルポインタ 開いているファイルへのポインタです。

例:

FILE *fptr ; fptr= fopen(fileName.txt, w); ----------   Some file Operations   ------- fclose(fptr); 

C でのファイルハンドリングの例

例 1: ファイルを作成し、書き込み、ファイルを閉じるプログラム

C




// C program to Open a File,> // Write in it, And Close the File> #include> #include> int> main()> {> > // Declare the file pointer> > FILE> * filePointer;> > // Get the data to be written in file> > char> dataToBeWritten[50] => 'techcodeview.com-A Computer '> > 'Science Portal for Geeks'> ;> > // Open the existing file GfgTest.c using fopen()> > // in write mode using 'w' attribute> > filePointer => fopen> (> 'GfgTest.c'> ,> 'w'> );> > // Check if this filePointer is null> > // which maybe if the file does not exist> > if> (filePointer == NULL) {> > printf> (> 'GfgTest.c file failed to open.'> );> > }> > else> {> > printf> (> 'The file is now opened. '> );> > // Write the dataToBeWritten into the file> > if> (> strlen> (dataToBeWritten)>0) {>> > // writing in the file using fputs()> > fputs> (dataToBeWritten, filePointer);> > fputs> (> ' '> , filePointer);> > }> > // Closing the file using fclose()> > fclose> (filePointer);> > printf> (> 'Data successfully written in file '> > 'GfgTest.c '> );> > printf> (> 'The file is now closed.'> );> > }> > > return> 0;> }>

出力

The file is now opened. Data successfully written in file GfgTest.c The file is now closed. 

このプログラムは、ソース ファイルと同じディレクトリに GfgTest.c という名前のファイルを作成します。このファイルには次のテキストが含まれます: techcodeview.com-A Computer Science Portal for Geeks。

例 2: ファイルを開いて読み取り、ファイルを閉じるプログラム

C




// C program to Open a File,> // Read from it, And Close the File> #include> #include> int> main()> {> > // Declare the file pointer> > FILE> * filePointer;> > // Declare the variable for the data to be read from> > // file> > char> dataToBeRead[50];> > // Open the existing file GfgTest.c using fopen()> > // in read mode using 'r' attribute> > filePointer => fopen> (> 'GfgTest.c'> ,> 'r'> );> > // Check if this filePointer is null> > // which maybe if the file does not exist> > if> (filePointer == NULL) {> > printf> (> 'GfgTest.c file failed to open.'> );> > }> > else> {> > printf> (> 'The file is now opened. '> );> > // Read the dataToBeRead from the file> > // using fgets() method> > while> (> fgets> (dataToBeRead, 50, filePointer)> > != NULL) {> > // Print the dataToBeRead> > printf> (> '%s'> , dataToBeRead);> > }> > // Closing the file using fclose()> > fclose> (filePointer);> > printf> (> > 'Data successfully read from file GfgTest.c '> );> > printf> (> 'The file is now closed.'> );> > }> > return> 0;> }>

出力

The file is now opened. techcodeview.com-A Computer Science Portal for Geeks Data successfully read from file GfgTest.c The file is now closed. 

このプログラムは、前の例で作成した GfgTest.c という名前のファイルからテキストを読み取り、コンソールに出力します。

バイナリ ファイルの読み取りと書き込み

これまでは、テキスト ファイルの操作についてのみ説明してきました。バイナリ ファイルの操作はテキスト ファイルの操作と似ていますが、ほとんど違いはありません。

バイナリファイルを開く

バイナリ モードでファイルを開くには、fopen() 関数で rb、rb+、ab、ab+、wb、および wb+ アクセス モードを使用します。バイナリ ファイル名には .bin ファイル拡張子も使用します。

fptr = fopen('filename.bin', 'rb'); 

バイナリファイルへの書き込み

fwrite() 関数を使用してデータをバイナリ ファイルに書き込みます。データはビット (0 と 1) の形式でバイナリ ファイルに書き込まれます。

fwrite() の構文

size_t   fwrite  (const void *  ptr  , size_t   size  , size_t   nmemb  , FILE *  file_pointer  ); 

パラメーター:

  • ポイント: 書き込まれるメモリのブロックへのポインタ。
  • サイズ: 書き込まれる各要素のサイズ (バイト単位)。
  • メンバ: 要素の数。
  • ファイルポインタ : 出力ファイル ストリームへの FILE ポインタ。

戻り値:

  • 書き込まれたオブジェクトの数。

例: fwrite() を使用してバイナリ ファイルに書き込むプログラム

C




// C program to write to a Binary file using fwrite()> #include> #include> struct> threeNum {> > int> n1, n2, n3;> };> int> main()> {> > int> n;> > // Structure variable declared here.> > struct> threeNum num;> > FILE> * fptr;> > if> ((fptr => fopen> (> 'C:program.bin'> ,> 'wb'> )) == NULL) {> > printf> (> 'Error! opening file'> );> > // If file pointer will return NULL> > // Program will exit.> > exit> (1);> > }> > int> flag = 0;> > // else it will return a pointer to the file.> > for> (n = 1; n <5; ++n) {> > num.n1 = n;> > num.n2 = 5 * n;> > num.n3 = 5 * n + 1;> > flag => fwrite> (&num,> sizeof> (> struct> threeNum), 1,> > fptr);> > }> > // checking if the data is written> > if> (!flag) {> > printf> (> 'Write Operation Failure'> );> > }> > else> {> > printf> (> 'Write Operation Successful'> );> > }> > fclose> (fptr);> > > return> 0;> }>

出力

Write Operation Successful 

バイナリファイルからの読み取り

fread() 関数を使用すると、C のバイナリ ファイルからデータを読み取ることができます。データは、保存されているときと同じ形式、つまりバイナリ形式でファイルから読み取られます。

fread() の構文

size_t   fread  (void *  ptr  , size_t   size  , size_t   nmemb  , FILE *  file_pointer  ); 

パラメーター:

  • ポイント: 読み取るメモリのブロックへのポインタ。
  • サイズ: 読み取る各要素のサイズ(バイト単位)。
  • メンバ: 要素の数。
  • ファイルポインタ : 入力ファイル ストリームへの FILE ポインタ。

戻り値:

  • 書き込まれたオブジェクトの数。

例: fread() を使用してバイナリ ファイルから読み取るプログラム

C




// C Program to Read from a binary file using fread()> #include> #include> struct> threeNum {> > int> n1, n2, n3;> };> int> main()> {> > int> n;> > struct> threeNum num;> > FILE> * fptr;> > if> ((fptr => fopen> (> 'C:program.bin'> ,> 'rb'> )) == NULL) {> > printf> (> 'Error! opening file'> );> > // If file pointer will return NULL> > // Program will exit.> > exit> (1);> > }> > // else it will return a pointer to the file.> > for> (n = 1; n <5; ++n) {> > fread> (&num,> sizeof> (> struct> threeNum), 1, fptr);> > printf> (> 'n1: %d n2: %d n3: %d '> , num.n1, num.n2,> > num.n3);> > }> > fclose> (fptr);> > return> 0;> }>

出力

n1: 1 n2: 5 n3: 6 n1: 2 n2: 10 n3: 11 n1: 3 n2: 15 n3: 16 n1: 4 n2: 20 n3: 21 

C の fseek()

ファイル内に複数のレコードがあり、特定の位置にある特定のレコードにアクセスする必要がある場合、そのレコードを取得する前にすべてのレコードをループする必要があります。これを行うと、大量のメモリと操作時間が無駄になります。メモリ消費量と動作時間を削減するには、次のような方法があります。 fseek() これにより、必要なデータに簡単にアクセスできるようになります。 C の fseek() 関数は、ファイル内の指定されたレコードにカーソルをシークします。

fseek() の構文

int fseek(FILE *ptr, long int offset, int pos); 

fseek() の例

C




// C Program to demonstrate the use of fseek() in C> #include> int> main()> {> > FILE> * fp;> > fp => fopen> (> 'test.txt'> ,> 'r'> );> > // Moving pointer to end> > fseek> (fp, 0, SEEK_END);> > // Printing position of pointer> > printf> (> '%ld'> ,> ftell> (fp));> > return> 0;> }>

出力

81 

C の rewind()

巻き戻し() この関数は、ファイル ポインタをファイルの先頭に移動するために使用されます。先頭にファイル ポインタが必要な場合は、fseek() の代わりに使用できます。

rewind() の構文

  rewind   (  file_pointer  ); 

C




// C program to illustrate the use of rewind> #include> int> main()> {> > FILE> * fptr;> > fptr => fopen> (> 'file.txt'> ,> 'w+'> );> > fprintf> (fptr,> 'Geeks for Geeks '> );> > // using rewind()> > rewind> (fptr);> > // reading from file> > char> buf[50];> > fscanf> (fptr,> '%[^ ]s'> , buf);> > printf> (> '%s'> , buf);> > return> 0;> }>

出力

Geeks for Geeks 

C ファイル操作の追加関数

次の表は、ファイル操作を実行したり、操作の実行を支援したりするために使用できる機能をさらにいくつかリストしたものです。

機能 説明
fopen() ファイルを作成したり、ファイルを開くために使用されます。
fclose() ファイルを閉じるために使用されます。
fgets() ファイルを読み取るために使用されます。
fprintf() データのブロックをファイルに書き込むために使用されます。
fscanf() ファイルからデータのブロックを読み取るために使用されます。
getc() 単一の文字をファイルに読み取るために使用されます。
putc() 単一の文字をファイルに書き込むために使用されます。
fseek() ファイル ポインタの位置を指定された場所に設定するために使用されます。
ftell() ファイル ポインタの現在位置を返すために使用されます。
巻き戻し() ファイルポインタをファイルの先頭に設定するために使用されます。
putw() 整数をファイルに書き込むために使用されます。
getw() ファイルから整数を読み取るために使用されます。