[C++] 122 文字列末尾の判定および削除

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

備忘として残しておきます。

// 文字列末尾が","であれば削除する
string str = "xxxxx";

int length = str.size();
char last = str.at(length -1);
string last_str{last}; // 初期化リストを用いる手法でchar単体→string変換
   
if (last_str.find(",") != std::string::npos){
    str.pop_back();
}

[C++] 121 FLTK : CSVファイルの読込 Fl_File_Chooser

[M1 Mac, Big Sur 11.6.8, clang 13.0.0, NO IDE]

よく使う色をまとめたCSVファイルを作成しておいてアプリに読み込ませました。

RGBで登録するとカンマがvectorに入り込むため処理が少しややこしくなります。

#include <csvProcessChar.h>
#include <cppstd.h> // 自製C++標準ライブラリ群

vector<vector<const char*>> csvProcessChar::load(string path) {
    string eles;
    string ele;
    vector<vector<const char*>> vec2D;
    
    // csvファイル指定
    std::ifstream file(path);

    while (getline(file, eles)) {
        vector<const char*> vec;  
        std::istringstream line(eles);
        vector<string> rgb;

        cout << "eles " << eles << endl;

        int num = 1;
        if (eles.find("RGB") == std::string::npos){
            while (getline(line, ele, ',')) {
                if (num == 1){
                    const char* name_c = ele.c_str();
                    char* name_c2 = new char[strlen(name_c) + 1];
                    strcpy(name_c2, name_c);
                    vec.push_back(name_c2);
                } else if (num == 2){
                    const char* roma_c = ele.c_str();
                    char* roma_c2 = new char[strlen(roma_c) + 1];
                    strcpy(roma_c2, roma_c);
                    vec.push_back(roma_c2);
                } else {
                    const char* code_c = ele.c_str();
                    char* code_c2 = new char[strlen(code_c) + 1];
                    strcpy(code_c2, code_c);
                    vec.push_back(code_c2);
                    
                }
                num += 1;
            }
        } else {
            // RGBの場合
            while (getline(line, ele, ',')) {
                if (num == 1){
                    const char* name_c = ele.c_str();
                    char* name_c2 = new char[strlen(name_c) + 1];
                    strcpy(name_c2, name_c);
                    vec.push_back(name_c2);
                } else if (num == 2){
                    const char* roma_c = ele.c_str();
                    char* roma_c2 = new char[strlen(roma_c) + 1];
                    strcpy(roma_c2, roma_c);
                    vec.push_back(roma_c2);
                } else {
                    rgb.push_back(ele); // 3番目以降は一旦vectorへ入れてから後で結合する
                }
                num += 1;
            }
        }
        if (!(rgb.size() == 0)){
            cout << "RGBあり" << endl;
            const char* delim = ","; // 区切り文字

            // vector要素結合
            std::ostringstream os;
            std::copy(rgb.begin(), rgb.end(), std::ostream_iterator<string>(os, delim));
            string str = os.str();

            const char* code_c = str.c_str();
            char* code_c2 = new char[strlen(code_c) + 1];
            strcpy(code_c2, code_c);
            vec.push_back(code_c2);

        }
        vec2D.push_back(vec);
    }

    return vec2D;
}