Yamamoto's Laboratory

c++ メモ

目次


動的配列

cでは,配列を宣言するときその配列の大きさを変数で決めることができなかった.一方,c++では動的にメモリを確保して,変数で配列の大きさを決めることができる.これを動的配列という. 例えば,cでは,

#define N 100
   .
   .
  double a[N];

などとしなければいけなかったが,動的配列を使うと

  int n;
  cin >> n;
  double *a;
  a = new double [n]; // aは,要素番号 0 から n-1 を持つ配列

という風に,new演算子を使う.ここで忘れてはいけないのが,メモリの解放である.これを忘れると大変なことになるような気がする.

  delete [] a; // メモリ解放

さらに2次元配列も動的にとることができる.これにはポインタのポインタを使う.n*mの配列を作る例を以下に示す.

  int n, m;

  double **a;
  a = new double* [n];
  *a = new double [n*m];
  for(int i=1; i < n; i++)  *(a+i) = *a + (i*m);

  // メモリ解放
  delete [] *a;
  delete [] a;

ファイル入出力

ファイルの入出力にはfstreamをつかう.ファイル出力は簡単で,coutなどと同じようにすればいい.

  ofstream out("outfile"); // outfileに書き出す
  double x = 1.5;
  out << "x= "<< x << endl; 
という風に書く.

ファイル入力にはifstreamを使う.とりあえず一つの文字列ずつ読み込むには,

  ifstream in("infile"); // infile を開く
  if(!in){
    cout << "no file" << endl;
    return 0;
  }

  string s;
  while(in){ // ファイルの終わりに達すると false をかえす
    in >> s;
    if(in) cout << s << endl; // 一つの文字列ごとに書き出す
  }

一行ごとに読み出して処理したいときは次のようにする.

  ifstream in("infile");
  if(!in){
    cerr << "no file" << endl;
    return 0;
  }

  string one_ch;
  string sline;

  while( in ){
    getline( in, sline ); // 一行だけslineに入れる
    if(in){
      stringstream ssline;
      ssline << sline ;
      while( ssline ){
	ssline >> one_ch;
	if(ssline) cout << one_ch <<"\t";
      }
      cout << endl;
    }
  }

こんな風にするとファイルの内容が表示されるだけだが,本当は読み込んだときにいろいろな処理をする.ここで使ったstringstreamは結構便利である.これは#include < sstring > をインクルードする.



no counter