[解決済み] C++による簡単な文字列のパース
2022-03-11 11:16:56
質問
C++を使い始めてからかなり経ちますが、それにも関わらず
scanf
簡単なテキストファイルをパースしなければならないとき。たとえば、次のような構成があるとします(フィールドの順序が異なる可能性も想定しています)。
foo: [3 4 5]
baz: 3.0
というようなことを書きます。
char line[SOME_SIZE];
while (fgets(line, SOME_SIZE, file)) {
int x, y, z;
if (3 == sscanf(line, "foo: [%d %d %d]", &x, &y, &z)) {
continue;
}
float w;
if (1 == sscanf(line, "baz: %f", &w)) {
continue;
}
}
C++でこれを実現する最も簡潔な方法は何でしょうか?私が試したときはいつも、たくさんの足場となるコードで終わってしまいます。
どうすれば解決するの?
標準C++のみでのトライです。
ほとんどの場合、私はstd::istringstreamとstd::getline(単語の区切りに効果がある)の組み合わせで、欲しいものを得るために使っています。そして、もし可能なら、私は自分の設定ファイルを次のようなものにする。
foo=1,2,3,4
というように、簡単になります。
テキストファイルはこんな感じです。
foo=1,2,3,4
bar=0
そして、このようにパースするのです。
int main()
{
std::ifstream file( "sample.txt" );
std::string line;
while( std::getline( file, line ) )
{
std::istringstream iss( line );
std::string result;
if( std::getline( iss, result , '=') )
{
if( result == "foo" )
{
std::string token;
while( std::getline( iss, token, ',' ) )
{
std::cout << token << std::endl;
}
}
if( result == "bar" )
{
//...
}
}
関連
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み] 式はクラス型を持つ必要があります。
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み] std::string を const char* または char* に変換する方法
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] C++でintをstringに変換する最も簡単な方法
-
[解決済み] 型名の後の括弧は、newで違いがあるのでしょうか?
-
[解決済み] std::stringのインスタンスを小文字に変換する方法
-
[解決済み] C++で文字列が文字列を含むかどうかをチェックする
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] 非静的データメンバの無効な使用
-
[解決済み】指定範囲内の乱数で配列を埋める(C++)
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】デバッグアサーションに失敗しました