Computer-programming-file-io

提供:Dev Guides
移動先:案内検索

コンピュータープログラミング-ファイルI/O

コンピューターファイル

コンピューターファイルは、プレーンテキスト、画像データ、またはその他のコンテンツのようなデジタル形式でデータを保存するために使用されます。 コンピューターファイルは、異なるディレクトリ内に整理できます。 ファイルはデジタルデータを保持するために使用され、ディレクトリはファイルを保持するために使用されます。

コンピューターファイルは、紙の文書のデジタル版と見なすことができます。 プログラミング中、ソースコードはさまざまな拡張子を持つテキストファイルに保持します。たとえば、Cプログラミングファイルは拡張子 .c で終わり、Javaプログラミングファイルは .java で終わり、Pythonファイルは .py で終わります。

ファイル入出力

通常、メモ帳、MS Word、MS Excel、MS Powerpointなどのテキストエディターを使用してファイルを作成します。 ただし、多くの場合、コンピュータープログラムを使用してファイルを作成する必要があります。 コンピュータープログラムを使用して、既存のファイルを変更できます。

ファイル入力はファイルに書き込まれるデータを意味し、ファイル出力はファイルから読み取られるデータを意味します。 実際、入力と出力の用語は、画面の入力と出力により関連しています。 結果を画面に表示するとき、出力と呼ばれます。 同様に、コマンドプロンプトからプログラムに入力を提供する場合、それは入力と呼ばれます。

今のところ、ファイルへの書き込みはファイル入力であり、ファイルからの読み取りはファイル出力であることを覚えておくだけで十分です。

ファイル操作モード

コンピュータープログラムを使用してファイルの操作を開始する前に、新しいファイルが存在しない場合は作成するか、既存のファイルを開く必要があります。 いずれの場合でも、次のモードでファイルを開くことができます-

  • 読み取り専用モード-既存のファイルを読み取るだけで、ファイルにそれ以上コンテンツを書きたくない場合は、ファイルを読み取り専用モードで開きます。 ほとんどすべてのプログラミング言語は、読み取り専用モードでファイルを開くための構文を提供します。
  • 書き込み専用モード-既存のファイルまたは新しく作成されたファイルのいずれかに書き込むが、そのファイルから書き込まれた内容を読みたくない場合は、書き込み専用モードでファイルを開きます。 すべてのプログラミング言語は、書き込み専用モードでファイルを開くための構文を提供します。
  • 読み取りおよび書き込みモード-同じファイルへの読み取りと書き込みを行う場合、ファイルを読み取りおよび書き込みモードで開きます。
  • 追加モード-書き込み用にファイルを開くと、ファイルの先頭から書き込みを開始できます。ただし、既存のコンテンツがある場合は上書きされます。 既存のコンテンツを上書きしたくない場合、追加モードでファイルを開きます。 追加モードは最終的には書き込みモードであり、ファイルの最後にコンテンツを追加できます。 ほとんどすべてのプログラミング言語は、追加モードでファイルを開くための構文を提供します。

次のセクションでは、新しいファイルを開く方法、ファイルに書き込む方法、および後で同じファイルにコンテンツを読み込んで追加する方法を学習します。

ファイルを開く

  • fopen()関数を使用して、新しいファイルを作成するか、既存のファイルを開くことができます。 この呼び出しは、ストリームを制御するために必要なすべての情報を含む *FILE 型のオブジェクトを初期化します。 ここにプロトタイプ、つまりこの関数呼び出しの署名があります-
FILE *fopen( const char *filename, const char* mode );

ここで、*ファイル名*は文字列リテラルであり、これを使用してファイルに名前を付け、*モード*にアクセスすると次の値のいずれかを持つことができます-

Sr.No Mode & Description
1

r

読み取り用に既存のテキストファイルを開きます。

2

w

書き込み用のテキストファイルを開きます。 存在しない場合は、新しいファイルが作成されます。 ここで、プログラムはファイルの先頭からコンテンツの書き込みを開始します。

3

a

追加モードで書き込むためにテキストファイルを開きます。 存在しない場合は、新しいファイルが作成されます。 ここで、プログラムは既存のファイルコンテンツにコンテンツの追加を開始します。

4

r+

読み取りと書き込みの両方のためにテキストファイルを開きます。

5

w+

読み取りと書き込みの両方のためにテキストファイルを開きます。 ファイルが存在する場合、最初にファイルの長さをゼロに切り捨てます。そうでない場合、ファイルが存在しない場合は作成します。

6

a+

読み取りと書き込みの両方のためにテキストファイルを開きます。 存在しない場合、ファイルを作成します。 読み取りは最初から始まりますが、書き込みは追加のみ可能です。

ファイルを閉じる

ファイルを閉じるには、* fclose()*関数を使用します。 この関数のプロトタイプは-

 int fclose( FILE *fp );
  • fclose()関数は、成功時にゼロを返します。ファイルを閉じるときにエラーが発生した場合は、 *EOF (特殊文字)を返します。 この関数は、バッファ内でまだ保留中のデータをファイルに実際にフラッシュし、ファイルを閉じて、ファイルに使用されているメモリを解放します。 EOFは、ヘッダーファイル stdio.h で定義されている定数です。

文字ごとに、または固定長文字列の形式でファイルを読み書きするために、C標準ライブラリによって提供されるさまざまな関数があります。 次のセクションでそれらのいくつかを見てみましょう。

ファイルを書く

以下は、個々の文字をストリームに書き込むための最も単純な関数です-

int fputc( int c, FILE *fp );

関数* fputc()は、引数cの文字値を *fp によって参照される出力ストリームに書き込みます。 成功時に書き込まれた文字を返します。エラーがある場合は EOF を返します。 次の関数を使用して、ヌル終了文字列をストリームに書き込むことができます-

int fputs( const char *s, FILE *fp );

関数* fputs()は、文字列 *s をfpによって参照されるファイルに書き込みます。 成功すると負でない値を返します。そうでない場合は、エラーの場合に EOF が返されます。 関数 int fprintf(FILE fp、const char * format、…​)*を使用して、ファイルに文字列を書き込むこともできます。 次の例を試してください-

#include <stdio.h>

int main() {
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

上記のコードをコンパイルして実行すると、 /tmp ディレクトリに新しいファイル test.txt が作成され、2つの異なる関数を使用して2行が書き込まれます。 次のセクションでこのファイルを読みましょう。

ファイルを読む

以下は、文字ごとにテキストファイルを読み取るための最も単純な関数です-

int fgetc( FILE * fp );
  • fgetc()関数は、 *fp によって参照される入力ファイルから文字を読み取ります。 戻り値は読み取られた文字です。またはエラーが発生した場合、 EOF を返します。 次の関数を使用すると、ストリームから文字列を読み取ることができます-
char *fgets( char *buf, int n, FILE *fp );

関数* fgets()は、 *fp によって参照される入力ストリームから最大n-1文字を読み取ります。 読み取った文字列をバッファ buf にコピーし、文字列を終了するために null 文字を追加します。

この関数は、最大文字数を読み取る前に改行文字「\ n」またはEOFに遭遇した場合、改行文字を含むその時点までに読み取られた文字のみを返します。 int fscanf(FILE fp、const char * format、…​)*を使用してファイルから文字列を読み取ることもできますが、最初のスペース文字が検出されると読み取りを停止します。

#include <stdio.h>

main() {

   FILE *fp;
   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);
}

上記のコードがコンパイルおよび実行されると、前のセクションで作成されたファイルを読み取り、次の結果を生成します-

1 : This
2 : is testing for fprintf...

3 : This is testing for fputs...

ここで何が起こったのか分析しましょう。 まず、* fscanf()メソッドは *This を読み取ります。その後、スペースに遭遇したためです。 2番目の呼び出しは* fgets()に対するもので、行の終わりに達するまで残りの行を読み取ります。 最後に、最後の呼び出し fgets()*は2行目を完全に読み取ります。

JavaのファイルI/O

Javaは、ファイルI/Oを処理するためのさらに豊富な機能セットを提供します。 このトピックの詳細については、Javaチュートリアルを確認することをお勧めします。

ここでは、上記で説明したCプログラムと同等の単純なJavaプログラムが表示されます。 このプログラムは、テキストファイルを開き、そこに数行のテキストを書き込み、ファイルを閉じます。 最後に、同じファイルが開かれ、作成済みのファイルから読み取られます。 次のプログラムを実行して、出力を確認することができます-

import java.io.*;

public class DemoJava {
   public static void main(String []args) throws IOException {
      File file = new File("/tmp/java.txt");

     //Create a File
      file.createNewFile();

     // Creates a FileWriter Object using file object
      FileWriter writer = new FileWriter(file);

     //Writes the content to the file
      writer.write("This is testing for Java write...\n");
      writer.write("This is second line...\n");

     //Flush the memory and close the file
      writer.flush();
      writer.close();

     //Creates a FileReader Object
      FileReader reader = new FileReader(file);
      char [] a = new char[100];

     //Read file content in the array
      reader.read(a);
      System.out.println( a );

     //Close the file
      reader.close();
   }
}

上記のプログラムが実行されると、次の結果が生成されます-

This is testing for Java write...
This is second line...

PythonのファイルI/O

次のプログラムは、新しいファイルを開いてコンテンツを書き込み、最後に同じファイルを読み取るための同じ機能を示しています-

# Create a new file
fo = open("/tmp/python.txt", "w")

# Writes the content to the file
fo.write( "This is testing for Python write...\n");
fo.write( "This is second line...\n");

# Close the file
fo.close()

# Open existing file
fo = open("/tmp/python.txt", "r")

# Read file content in a variable
str = fo.read(100);
print str

# Close opened file
fo.close()

上記のコードが実行されると、次の結果が生成されます-

This is testing for Python write...
This is second line...