私のシナリオでは、CSV を使用してパラメーター ファイルを作成する必要があります。すべての行は構成データを意味し、行の最初のフィールドはヘッダーとして扱われ、識別子として使用されます。以下のような CSV の形式は、解析が簡単です。
1,field1,field2,field3,field4 // 1 indicated the TARGET that the other fields will be writted to.
1,field1,field2,field3,field4
2,field1,field2,field3,field4
2,field1,field2,field3,field4........
しかし、それはユーザーにとってフレンドリーではありません。そのため、以下のように csv ファイルを定義します。
HeaderLine_Begin,1
field1,field2,field3,field4
field1,field2,field3,field4
HeaderLine_Begin,2
field1,field2,field3,field4
field1,field2,field3,field4
つまり、すべての行はデータが HeaderLine_Begin によってターゲットに書き込まれることを意味します。実際のデータから ID を分離するだけです。次に、次のような構造体を作成します。
enum myenum
{
ON,OFF,NOCHANGE
};
struct Setting
{
int TargetID;
string field1;
string field2;
myenum field3;
myenum field4;
};
以下のようにcsvを1行ずつ読み取るためのコードを書く方法を知っていました
filename +=".csv";
std::ifstream file(filename.c_str());
std::string line;
while ( file.good() )
{
getline ( file, line, '\n' ); // read a line until last
if(line.compare(0,1,"#") == 0) // ignore the comment line
continue;
ParseLine();// DONE.Parse the line if it's header row OR data row
}
file.close(); // close file
私がやりたいのは、データを保持するためのvetor設定のようなリストを作成することです.フローは、最初のheaderID1を見つけて、次の行を見つける必要があります.次の行がデータラインの場合、データラインが属するものとして扱いますheaderID1.次の行が別の headerID の場合、再度ループします。
問題は、headerRow を見つけた後に行をフェッチするための std::getnextline(int lineIndex) がないことです。