C++でExcelファイルを読み書きする2【Visual Studioを使ったC言語実践】

C++でExcelファイルを読み書きする2【Visual Studioを使ったC言語実践】

今回も前回に引き続き、C++でExcelファイル(CSVファイル)を読み書きする方法をお伝えしていきます。

(前回記事→C++でExcelファイルを読み書きする1【Visual Studioを使ったC言語実践】)

また、この方法ではVisual Studio 2019 Communityを使っていきますが、インストールの方法は、

VISUAL STUDIOを使ったC++開発の準備1【VISUAL STUDIO 2019 COMMUNITYのインストール】

をご覧ください。

今回の目標

前回は、CSVファイルを作成・上書き保存する方法をお伝えしました。

そして第二回の今回は、CSVファイルからデータを読み込み、それらのデータ処理をする方法をお伝えしていきます。


ソースコード例

まず、説明の前に今回書くコードを全てお見せします。


#include<stdio.h> //ファイル等の入力操作のための標準入力ヘッダーの読み込み
#define _USE_MATH_DEFINES //数値入力演算定数を定義
#include<math.h>
#include<stdlib.h> //EOF処理のため

#define MaxN 100

FILE*fp1;

int main(void){

	double x[MaxN] = { 0.0 };

	int i,k;
	int N;

	fopen_s(&fp1, "data_1.csv", "r");

	i = 1;


	while (fscanf_s(fp1, "%lf,", &x[i]) !=EOF){
		i++;
	}

	for (k = 1; k < i; k++) {
		printf("%d番目のデータ:%lf\n", k, x[k]);
	}
	printf("\nデータの個数:%d\n", i-1);

	fclose(fp1);

	return (0);

}

上に示したプログラムは、CSVファイルからデータを読み取り、そのデータの個数と読み取ったデータをPC画面上に返すというプログラムです。


Step1.読み取るCSVファイルを用意する

今回読み取り用に用意したデータは「data_1.csv」という名前の、下の画像のようなCSVファイルです。

すべてのデータが横並びに並んでいます。

前回、CSVファイルは横の移動が「,」区切り、縦の改行が「¥」区切りであると説明しました。ですので、このデータはすべて「,」によって区切られたデータということになります。

イメージ的にはこんな感じです。このデータをプログラムで読み取っていこうというわけです。


Step2.CSVファイルを開く

まず、ファイル読み取り用のファイルポインタをfp1とします。そして前回同様fopen_s関数でファイルオープンをしていくわけですが、今回はモードが”r”モードになっています。

前回、”w”(ライトモード) と “a”(アンペアモード) を紹介しましたが、今回使うのは「リードモード」 “r” です。

リードモードは、 ファイルの読み取りのみをするモードになります。今回ファイルに追記はしないのでこの “r” モードで行きます。


Step3.CSVファイルを読み取る

次はCSVファイルのデータを読み取っていきます。

まずデータを格納する一次元配列が必要なので、

doube x[MaxN]={0.0};

のように用意し、全要素を0.0に初期化しておきます。

そして次にデータの読み込みですが、while文を使ってこのように書きます

while (fscanf_s(fp1, "%lf,", &x[i]) !=EOF){
	i++;
}

ループを抜ける条件は「すべてデータを取りつくしたとき」になりますが、見慣れない関数があると思うので少し解説します。

まずfscanf_s関数はデータを読み取り、格納するための関数です。(Visual Studio特有の関数になるので他の環境で動作するかは知りません)カッコの中は、

fscanf_s(ファイルポインタ, “データの型”, 格納する要素);

のように記述します。

ここでひとつ重要なポイントがあるのですが、fscanf_sの中に注目してもらうと、%lfの後ろにコンマ「,」が打ってあることが分かると思います。

このコンマは先ほど説明したデータの区切りのカンマです。今回のCSVファイルは横並びなので、すべて「,」によって区切られています。つまり数字と「,」がセットでひとつのデータであり、%lfの後ろには「,」が必要になるのです。

また同じように、用意したデータが縦並びだった場合は「¥」までセットでデータを読み込む必要があります。

次に、 EOFは「End Of File」の略で、ファイルの終わりという意味になります。つまり「!=」がノットイコールの意味なので、ファイルが終わらない限りこのループが続くという意味になります。

したがって、ファイルのデータを取りつくすとwhile文を抜け、すべてのデータが一次元配列 x[i] に格納された状態になります。


Step4.データをPC画面に出力

次に、それぞれのデータが一次元配列に格納されたところでそれらをPC画面に表示させていきます。とはいってもこの部分は基礎的なところなのでサラッと説明します。

for (k = 1; k < i; k++) {
		printf("%d番目のデータ:%lf\n", k, x[k]);
	}
	printf("\nデータの個数:%d\n", i-1);

	fclose(fp1);

このようにfor文でループを回して、すべての一次元配列を表示させていきます。

ここで、先ほどのwhile文でループカウンターの「i」がデータを読み取った後に加算されていくため、読み取ったデータよりも+1だけ大きいことに注意します。

するとfor文のループカウンターのkは i を含まず、また、データの個数は i よりも1小さくなります。

こうしてすべてのデータとその個数を表示するプログラムができたので、ファイルをクローズします。

実行すると、

このような感じになります。

こんなところで、C言語でExcelファイルを読み書きする方法の第二回を終わりたいと思います。


参考書