[C++] 256 SDL : テトリス画面にベストスコア5つを表示 その4 CSVファイル更新

[M1 Mac, Monterey 12.6.3, clang 13.0.0, SDL 2.26.2, ChatGPT Plus, NO IDE]

テトリスのプレイ記録をCSVファイルに保存し、起動時・リスタート時にスコアベスト5を表示するようにしました。XMLでの苦労とは打って変わってのイージーモードでした。

これで最低限の機能を実装しました。ホールド機能などのワールドルールに準拠するかどうかはこれから考えます。

ネット麻雀の待ち牌表示やツモ切り表示のようなヌルい機能はいらない派なので多分実装しないでしょう。

struct Entry {
    int score;
    string date;
    string playtime;
};

vector<Entry> ReadCSV(const string& filename) {
    vector<Entry> entries;

    std::ifstream infile(filename);
    if (!infile) {
        cerr << "Failed to open file: " << filename << endl;
        return entries;
    }

	std::string line;
    std::getline(infile, line); // ヘッダ行を読み飛ばす
    while (std::getline(infile, line)) {
        std::istringstream iss(line);
        std::string score_str, date, playtime;
        std::getline(std::getline(iss, score_str, ','), date, ',');
        std::getline(iss, playtime, ',');
        int score = std::stoi(score_str);
        entries.push_back({score, date, playtime});
    }

    return entries;
}

int GetScoreAndDate() {
	vector<Entry> entries = ReadCSV(csvFile);

    // スコアで降順ソート
    sort(entries.begin(), entries.end(),
              [](const Entry& a, const Entry& b) { return a.score > b.score; });

    // 上位5件を取得して、スコアと日付をvectorに格納
    for (int i = 0; i < std::min(5, static_cast<int>(entries.size())); ++i) {
        scores.push_back(entries[i].score);
        string date = entries[i].date;
		replace(date.begin(), date.end(), '-', '/');
		dates.push_back(date.substr(5, 5));
    }

    return 0;
}

void CopyFile(const std::string& src_file, const std::string& dst_file) {
    std::ifstream src(src_file, std::ios::binary);
    std::ofstream dst(dst_file, std::ios::binary);
    dst << src.rdbuf();
}

void AddDataToCSV()
{
	std::ofstream outfile(csvFile, std::ios_base::app); // ファイルを追記モードで開く
    if (!outfile) {
        cerr << "Failed to open file: " << csvFile << endl;
        return;
    }

    outfile << m_score << "," << startTime << "," << elapsedTime << endl;

	// バックアップを作成する
    if (fs::exists(csvFile)) {
        CopyFile(csvFile, csvFileBackup);
    }
}