ファイル操作

File manipulation

概要 Abstract
プログラムで計算したデータを保存したり,設定ファイルを読み込んだり,といったことは,ほとんどのプログラムで行われる.ここではそのための方法を紹介する.
It is performed in most programs to save calculated data by program, read the configuration file. Here, Introduce method of that purpose.
目次 Table of contents

ファイルの操作の基本 Basics of operation of file

ファイル操作とは,ファイルにデータを保存したり,ファイルからデータを読み込んだりすることである.基本的には,画面の入出力と同じ感覚でファイルに書き込んだり,ファイルから読み込んだりできる.ファイル入出力の基本的な流れは,

File manipulation is to save data to file, read data from file andso on. Basically, you can write in file and read from file by the same feeling as input-output on screen. Basic flow of file I/O,

  1. ファイルを開く Open file
  2. データを読み込んだり書き込んだり Read and write data
  3. ファイルを閉じる Close file
    となっていて,つまり画面の入出力と全く異なるのは「ファイルを開く」と「閉じる」の操作を余分にする必要があることのみ.データベースのようにファイルの中を行ったり来たりする処理など,画面の入出力よりも多彩な関数が用意されているが,当面はファイルに書き込んだり,ファイルから読み込んだりできれば十分である.
    In other words, only that it is necessary to perform extra operation of "Open file" and "Close", is different from input-output of screen. Like database, various functions(including processes that you come and go in file) are prepared than screen input-output, but it is enough to write and read from file for the time being.

実装編 Implementation edition

以下ではファイル操作の方法として,C++流のストリームオブジェクトを使用した方法と,C言語流のストリーム関数群を使用した方法の2通りを紹介する.

In the following, as method of file manipulation, introduce two ways of using stream object of C++ style and using stream set of functions of C language style.

C++流:ストリームオブジェクトを使う C++ style: Use stream object

ストリームオブジェクトとは,標準ライブラリが提供するistream/ostream クラス,もしくはその派生クラスのことをいう (詳しくは IOstream Library - C++ Reference を参照).既に紹介した cout や cin は,それぞれ ostream (出力ストリームクラス), istream (入力ストリームクラス) の派生クラスで,標準出力に出力したり,標準入力から読み込んだりするために使用した.今回紹介するファイル入出力ストリームクラスも istream/ostream の派生クラスである.このように同じストリームクラスから派生させることによって,以下のような利点が得られている:

Stream object is istream/ostream class which standard library provides, or its derived class (For detail, refer to IOstream Library - C++ Reference). Already introduced cout and cin are derived class of ostream (output stream class), istream (input stream class), and are used to output in standard output and read from standard input. file I/O stream class to introduce this time are also derived classes of istream/ostream. In this way, by spinning it off from the same stream class, the following advantages are obtained:

  • {ostream, cout, ofstream} 及び {istream, cin, ifstream} のそれぞれの間で,同じインターフェイスを利用できる.例えば << 演算子や >> 演算子など. The same interface is available between {ostream, cout, ofstream} and {istream, cin, ifstream}. For example, <<operator and>> operator.
  • {cout, ofstream} 及び {cin, ifstream} のポインタ型/参照型は,それぞれ親クラスである ostream, istream クラスのポインタ型/参照型にキャストできる.これを利用すれば,関数を共通化するなどが可能. Pointer type / reference type are parent class of {cout, ofstream} and {cin, ifstream} respectively. You can cast to pointer type / reference type of ostream, istream class. If use this, commonizing function is possible.

ファイルに書き込む例(C++) Example to write in file (C++)

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>
  #include <fstream>  // ファイルストリームのヘッダ
  using namespace std;
  int main(int argc, char**argv)
  {
    // 1. データの生成
    int a[10][3];
    for (int i(0);i<10;++i)
      for (int j(0);j<3;++j)
        a[i][j] = (i+1)*(j+1);
    // 2. "hoehoe.dat" ファイルを開く
    ofstream fs ("hoehoe.dat");
      /* NOTE: 以下のように書いても同じ:
        ofstream fs;
        fs.open ("hoehoe.dat");
      */
    // 3. データの書き込み; cout と同じ.
    for (int i(0);i<10;++i)
    {
      fs << a[i][0];
      for (int j(1);j<3;++j)
        fs << "  " << a[i][j];
      fs << endl;
    }
    // 4. ファイルを閉じる
    fs.close();
  }

結果(テキストファイル "hoehoe.dat" が作成される)

Result (Text file "hoehoe.dat" is created)

 % ./a.out
 % cat hoehoe.dat
 1       2       3
 2       4       6
 3       6       9
 4       8       12
 5       10      15
 6       12      18
 7       14      21
 8       16      24
 9       18      27
 10      20      30

ファイルから読み込む例(C++) Example to read from file(C++)

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <iostream>
  #include <fstream>  // ファイルストリームのヘッダ
  using namespace std;
  int main(int argc, char**argv)
  {
    string filename = "hoehoe.dat";
    ifstream fs (filename.c_str());
    if (!fs)  // ファイルのオープンに失敗した場合
    {
      cerr << "file not found: " << filename << endl;
      return 1;
    }
    string str;
    int l(0);
    while (getline(fs, str, '\n'))  // 1行読み込み
      cout << "line " << ++l << ":  " << str << endl;
    fs.close();
  }

結果(実行には適当なテキストファイル "hoehoe.dat" が必要)

Result (Suitable text file "hoehoe.dat" is required for execution)

 % ./a.out
 line 1:  1  2  3
 line 2:  2  4  6
 line 3:  3  6  9
 line 4:  4  8  12
 line 5:  5  10  15
 line 6:  6  12  18
 line 7:  7  14  21
 line 8:  8  16  24
 line 9:  9  18  27
 line 10:  10  20  30

C言語流:ストリーム関数群を使う C language style: Use stream functions

次は,C言語流の関数インターフェイスを利用した方法だ.

Next, methods using function interface of C language style.

ヒント

Tips

 以下のプログラムでは stdio.h と stdlib.h をインクルードしているが,C++で fopen などの関数群を利用する場合は,
cstdio と cstdlib をインクルードすること (.h はつけない).こうすると,シンボルが名前空間に包まれる.

ファイルに書き込む例(C) Example to write in file(C)

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <stdio.h>
  #include <stdlib.h>
  int main(int argc, char**argv)
  {
    // 1. データの生成
    FILE *fp;
    int a[10][3],i,j;
    for (i=0;i<10;++i)
      for (j=0;j<3;++j)
        a[i][j] = (i+1)*(j+1);
    // 2. "hoehoe.dat" ファイルを開く."w": 書き込み(上書き)モード
    fp = fopen("hoehoe.dat","w");
    // 3. データの書き込み
    for (i=0;i<10;++i)
    {
      fprintf (fp,"%d",a[i][0]);
      for (j=0;j<3;++j)
        fprintf (fp,"\t%d",a[i][j]);
      fprintf (fp,"\n");
    }
    // 4. ファイルを閉じる
    fclose (fp);
    return 0;
  }

結果(テキストファイル "hoehoe.dat" が作成される)

Result (Text file "hoehoe.dat" is created)

 % ./a.out
 % cat hoehoe.dat
 1       2       3
 2       4       6
 3       6       9
 4       8       12
 5       10      15
 6       12      18
 7       14      21
 8       16      24
 9       18      27
 10      20      30

ファイルから読み込む例(C) Example to read from file (C)

length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1360.
length() used on @lines (did you mean "scalar(@lines)"?) at /usr/bin/code2html line 1370.
  #include <stdio.h>
  #include <stdlib.h>
  int main(int argc, char**argv)
  {
    FILE *fp;
    char *filename = "hoehoe.dat";
    char str[256];  // NOTE このサイズに意味はない.当てずっぽう.
    fp = fopen("hoehoe.dat","r");
    if (!fp)
    {
      printf ("file not found: %s\n",filename);
      return 1;
    }
    while (fgets(str,256,fp))
      printf (str);
    fclose (fp);
    return 0;
  }

結果(実行には適当なテキストファイル "hoehoe.dat" が必要)

Result (Suitable text file "hoehoe.dat" is required for execution)

 % ./a.out
 1       2       3
 2       4       6
 3       6       9
 4       8       12
 5       10      15
 6       12      18
 7       14      21
 8       16      24
 9       18      27
 10      20      30

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-30 (木) 07:17:06 (19d)