第六回-02 配列の実用例

配列は沢山のデータを格納して処理するために用いられることが多い。

本ページとそれに引き続く課題ではファイルからデータを読み込んで配列に格納し、それを加工する。


[準備] ファイルからデータを読み込み配列に格納

まずいつも通りコンソールプログラムのプロジェクトを作成しよう。
初めての C/C++ プログラミング(コンソールアプリケーション編)」を参考に作成する。
以下では ConsoleApplication06 というプロジェクト名であるとする。

次に、プログラムで用いるデータファイルdata_height.csv をダウンロードしよう。
リンク上で右クリックして「対象をファイルに保存」を選択するのだが、ダウンロードする場所が重要である。 ダウンロード場所は にして欲しい。

なお、このファイル (csv ファイル) は Excel で開くことができる。Excel で開いた様子はこちら。



また、このファイルはテキストエディタ (秀丸など) でも開くことができる。



このファイルは csv ファイル (comma separated values) と言い、Excel のデータから、フォント情報や罫線の情報を省き、
データのみを保存したものである。Excel で保存の際に「CSV (カンマ区切り)」を選択することで生成される。

このデータは Excel の学習において 種々の統計量と相関係数を学んだときに使ったもので、100 人分の身長のデータである。

さて、このデータを C/C++ プログラムで配列に格納して利用することを考えよう。

まず、いつも通り冒頭に include 文を記述する (本日は2行)。 コピーできる。

#include <iostream>
#include <fstream>


ファイルを読み込んで配列に格納する部分は、以下である。 「return 0;」の手前に以下をコピー&貼り付けして欲しい。

	std::ifstream ifs;  // ファイル読み取り用ストリーム
	ifs.open("data_height.csv");	// ファイルオープン

	if(ifs.fail()){	// ファイルオープンに失敗したらそこで終了
		std::cerr << "ファイルを開けません\n";
		exit(1);
	}

	char buf[256];	// データ一時保管用配列

	int linenum = 0; // データの行数を数える

	while(ifs.getline(buf,sizeof(buf))){	// ファイルから1行ずつ読み込む
		linenum++;	// 行数をカウントしている
	}

	std::cerr << "読み込んだ行数 = " << linenum << "\n";

	ifs.clear(); // ファイル末尾に到達というフラグをクリア
	ifs.seekg(0, std::ios::beg);	// ファイル先頭に戻る

	double *arr;
	arr = new double[linenum];	// 行数 linenum 分の配列を動的に確保

	for(int i=0 ; i<linenum ; i++){
		ifs.getline(buf,sizeof(buf));	// 一行読み込んで…
		arr[i] = atof(buf);	// それを配列に格納
	}

	// これで、arr[0]〜arr[linenum-1] に計 linenum 個のデータが格納された
	// この配列を操作する演習に答えよ。


以上の準備のもと、「デバッグ」→「デバッグなしで開始」を実行しよう。以下のような表示が現われれば成功である。
これで linenum 個のデータ (ここでは linenum = 100) が arr[i] という配列に格納された。



もし、以下のような表示になっていれば失敗である。恐らく データファイルdata_height.csv の位置が正しくないのでエクスプローラーで確認しよう。 ConsoleApplication06.cpp や stdafx.cpp と同じフォルダに data_height.csv を移動してから再チャレンジしよう。




[演習] 読み込んだ配列のデータをコンソールに表示

先程の続きとして、linenum 個のデータからなる配列 arr[i] を1行に1データずつコンソールに表示してみよう。
for 文を用いる。これはコピーできないようにしたので以下のように自分で記述してみて実行して欲しい。







←第六回-01 配列の基本第六回-03 [おまけ] スライダによる閾値の調節→

非情報系学生のための C/C++ 入門に戻る