• ベストアンサー

文字列の比較について

C++で勉強しているのですが、 下のような内容のファイルをつくり、プログラムで 左辺を検索して右辺の数字を読み込むには どうしたらよいでしょうか? ただし、1字1字の検索ではなく3文字なら3文字を 検索して右辺の数字を読み込むようにするような簡潔な プログラミングを望んでます。 (1文字ごとの検索なら簡単にできるのですが めちゃくちゃ汚いソースになったので完結にしたいのです。) -----------------------File Start opt = 1;      オプション番号 temp = 2;      テンポラリ位置 link =3;       リンカー場所 data=4;       データの種類 hoehoe = 5;    ほえほえの種類 -----------------------File END 例: dataという文字を探してその文字の右辺を読み取りたいのです。 セミコロンより右は読まないようにしたいのです。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • naitie
  • ベストアンサー率30% (18/60)
回答No.1

Cの標準ライブラリ関数だけで書きたいのですか? こういう処理は、誰でもすること&低レベルな(細かい)処理なので、ホントなら「自作」してはいけません。 記憶があまり定かでないのですが、 Windowsの環境でしたら GetProfileString、GetProfileStringIng, etc... が使えますし、C++のクラスライブラリにも適当なものが見つかるはずです。 (Javaなんかだと、言語標準でクラスが用意されてます。Properties) もしC標準ライブラリだけで自作するのであれば、下のヒントに書いた文字列操作関数を使うと便利だと思います(コンパイラがないので、ちゃんと動くコードをかけなくて残念ですが・・)。    char* strtok(const char*, const char*);    文字列をトークン(特定の文字により区切られる最小の要素)に分割する。    int strncmp(const char*, const char*, int); 文字列同士を先頭からNバイト比較する こういう関数を作成するなら「部品」として再利用したいですよね。 ガリガリと書いた挙句に、汎用性を欠く仕様(左辺がかならず行の最初から始まっていないと×、左辺と=、=と右辺の間にスペースが1つでないと×など・・)にならないよう気をつけてください。たとえば行の先頭が「;] (line[0] == ';') なら、注釈行として読み飛ばすなどの考慮があったほうがベターです。 標準ライブラリ関数も使わない・・なんてのは論外ですよ(笑)。。

tb4104
質問者

補足

すみません。情報が少なかったかも知れません。 とりあえず、DOS上でつかうもので、 また、相手のファイル(質問で出しましたデータSample)が どういう状況ではき出されているのか仕様が全く見えないもので、 分割していく方法しかないのですか。 わたしが考えていたのは、ラインを読み込み スペースを削除し、そして「;」以上は掃き捨てにし、 (ここまではできておるのですが)その後、 検索文字と比較しようとしていたのです。 これよりもいい操作があればと思っていたのですが・・・・ strtokを使うということには思いつきませんでした。 ありがとうございます。参考にさせていただきます。

その他の回答 (1)

  • terra5
  • ベストアンサー率34% (574/1662)
回答No.2

きちんとやる場合でなく、簡単に書く場合を・・・。 while(gets(line)) { n = sscanf(line," %[a-z] = %d ; %s", name,&num,comment); if ( n >= 2 && !strcmp(name,"data") { } } まあ、gets()なんて使うとバッファオーバーフロー攻撃を受けるとか, エラーチェックが手抜きとか、そういう問題はありますし、 その上、思いついたのを書き下ろしただけで、 コンパイルはおろか、ちゃんと動くかもわかりません(^^;;;; でも、私が使い捨てレベルのプログラムを書くときにはよく使ってます。

tb4104
質問者

お礼

ありがとうございました。 結局、自分でポインタごとに比較してやりました。 自分で作るのは難しいですね。

関連するQ&A

専門家に質問してみよう