🎉

c++でファイルから設定値を読み取る

2024/09/29に公開
設定ファイル.txt
A=30
B=40
C=50
...

みたいなのを読み取りたい。プログラム起動時にきりかえられて便利。

AIにお願いして読み取りプログラムを組んでおり、それで動きは十分だったのですが、さらにコメントをファイルに書き込んでも正常動作するようにしたかったので追加調査しました。その過程で、鵜吞みにしていたコードの理解も深まりました。

結果

文字列でよければ、下記のコードでよみ取れます。
もともとAIが生成してくれていたコードに、コメントの対応を自分で加えたものです。
仕様としては、「設定ファイルの各行の『=』でつないだものを変数&値として取り込む。行の先頭が#の場合はコメントとして無視する」です。

read_file.cpp

#include <string>
#include <iostream>
#include <fstream>
#include <sstream>

std::string file_path = "設定ファイル.txt";
std::map<std::string, std::string> config_data;
std::ifstream config_file(file_path);

std::string text_line, data_key, data_value;
while (std::getline(config_file, text_line)) {
    if (text_line[0] == '#') continue;
    std::istringstream line_stream(text_line);
    if(std::getline(line_stream, data_key, '=') && std::getline(line_stream, data_value)) {
    config_data[data_key] = data_value;
    }
}

一行ずつ読み取り、変数名と値として解釈していきます。
std::getline(line_stream, data_key, '=') && std::getline(line_stream, data_value) の処理で、「=」の両端をdata_key, data_value変数に入力できますが、このとき「=」がなければ if文の評価としてはfalseになっているようです。なので、continueしている部分がなくても「#」によるコメントは実現できています。一応、コメントの行の中に「=」が入ってしまうと設定値扱いされてしまうので、「先頭の文字が#だったらcontinue」というロジックをいれています。

なお、自分で追記したのはif (text_line[0] == '#') coninue; だけで、他はもともとchatGPTかPhindに生成してもらったものです。

感想

自分の貢献度が低い。一行。

Discussion