- ベストアンサー
文字列の比較について
C++で勉強しているのですが、 下のような内容のファイルをつくり、プログラムで 左辺を検索して右辺の数字を読み込むには どうしたらよいでしょうか? ただし、1字1字の検索ではなく3文字なら3文字を 検索して右辺の数字を読み込むようにするような簡潔な プログラミングを望んでます。 (1文字ごとの検索なら簡単にできるのですが めちゃくちゃ汚いソースになったので完結にしたいのです。) -----------------------File Start opt = 1; オプション番号 temp = 2; テンポラリ位置 link =3; リンカー場所 data=4; データの種類 hoehoe = 5; ほえほえの種類 -----------------------File END 例: dataという文字を探してその文字の右辺を読み取りたいのです。 セミコロンより右は読まないようにしたいのです。 宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
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] == ';') なら、注釈行として読み飛ばすなどの考慮があったほうがベターです。 標準ライブラリ関数も使わない・・なんてのは論外ですよ(笑)。。
その他の回答 (1)
- terra5
- ベストアンサー率34% (574/1662)
きちんとやる場合でなく、簡単に書く場合を・・・。 while(gets(line)) { n = sscanf(line," %[a-z] = %d ; %s", name,&num,comment); if ( n >= 2 && !strcmp(name,"data") { } } まあ、gets()なんて使うとバッファオーバーフロー攻撃を受けるとか, エラーチェックが手抜きとか、そういう問題はありますし、 その上、思いついたのを書き下ろしただけで、 コンパイルはおろか、ちゃんと動くかもわかりません(^^;;;; でも、私が使い捨てレベルのプログラムを書くときにはよく使ってます。
お礼
ありがとうございました。 結局、自分でポインタごとに比較してやりました。 自分で作るのは難しいですね。
補足
すみません。情報が少なかったかも知れません。 とりあえず、DOS上でつかうもので、 また、相手のファイル(質問で出しましたデータSample)が どういう状況ではき出されているのか仕様が全く見えないもので、 分割していく方法しかないのですか。 わたしが考えていたのは、ラインを読み込み スペースを削除し、そして「;」以上は掃き捨てにし、 (ここまではできておるのですが)その後、 検索文字と比較しようとしていたのです。 これよりもいい操作があればと思っていたのですが・・・・ strtokを使うということには思いつきませんでした。 ありがとうございます。参考にさせていただきます。