0
0

More than 1 year has passed since last update.

#includeを使い、fopenを使わずにcsvファイルから2次元配列を初期化する

Last updated at Posted at 2023-05-10

はじめに

stdio.hが使えずfopenが使えない環境下で、実行速度測定のために10000x10000の行列演算をプログラム埋め込みで行ったので、そのときのメモ

結論

matrix.csv
1,2,3,
4,5,6,
7,8,9,

上のような3x3の行列の値を示すcsvファイルがあり、Cプログラムでこの行列を2次元配列として扱いたい場合には、以下のように#includeを配列初期化部分に記述することで実現できる。

#define SIZE 3
int matrix[SIZE][SIZE] = {
    #include "matrix.csv"
};
// matrixの値は{{1,2,3},{4,5,6},{7,8,9}}となる

解説

ここからは解説なので読み飛ばしてもらって構いません。

上の書き方は配列初期化時の構文と#includeの仕様により実現できている。

C言語における配列の初期化

C言語では配列の宣言時に、以下のように各要素の初期値を設定できる。

int array[3] = {1,2,3};

行列データをプログラム内で2次元配列として扱う場合、

int matrix1[3][3] = {
    {1,2,3},
    {4,5,6},
    {7,8,9},
};

のように行の対応をとって初期化を行うことも可能だが、以下のように単純に値を並べるような初期化を行うこともできる。

int matrix2[3][3] = {1,2,3,4,5,6,7,8,9};

#includeの仕様

#includeが記述された部分はプリプロセッサにより、指定したファイルの中身に置換されるという仕様となっている。

matrix.csv
1,2,3,
4,5,6,
7,8,9,
int matrix[3][3] = {
    #include "matrix.csv"
};

そのため上のように記述した場合、プリプロセッサにより置換された結果として次のようなソースコードになる。

int matrix[3][3] = {
    1,2,3,
    4,5,6,
    7,8,9,
};

このように記述することで、csvファイルの値を2次元配列にセットすることができる。

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0