C++で勉強しているのですが、

下のような内容のファイルをつくり、プログラムで
左辺を検索して右辺の数字を読み込むには
どうしたらよいでしょうか?

ただし、1字1字の検索ではなく3文字なら3文字を
検索して右辺の数字を読み込むようにするような簡潔な
プログラミングを望んでます。
(1文字ごとの検索なら簡単にできるのですが
めちゃくちゃ汚いソースになったので完結にしたいのです。)
-----------------------File Start
opt = 1;      オプション番号
temp = 2;      テンポラリ位置
link =3;       リンカー場所
data=4;       データの種類
hoehoe = 5;    ほえほえの種類
-----------------------File END

例:
dataという文字を探してその文字の右辺を読み取りたいのです。
セミコロンより右は読まないようにしたいのです。

宜しくお願いします。

A 回答 (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] == ';')
なら、注釈行として読み飛ばすなどの考慮があったほうがベターです。

標準ライブラリ関数も使わない・・なんてのは論外ですよ(笑)。。

この回答への補足

すみません。情報が少なかったかも知れません。
とりあえず、DOS上でつかうもので、
また、相手のファイル(質問で出しましたデータSample)が
どういう状況ではき出されているのか仕様が全く見えないもので、
分割していく方法しかないのですか。

わたしが考えていたのは、ラインを読み込み
スペースを削除し、そして「;」以上は掃き捨てにし、
(ここまではできておるのですが)その後、
検索文字と比較しようとしていたのです。

これよりもいい操作があればと思っていたのですが・・・・

strtokを使うということには思いつきませんでした。
ありがとうございます。参考にさせていただきます。

補足日時:2002/04/02 00:40
    • good
    • 0

きちんとやる場合でなく、簡単に書く場合を・・・。




while(gets(line)) {
n = sscanf(line," %[a-z] = %d ; %s", name,&num,comment);
if ( n >= 2 && !strcmp(name,"data") {

}
}

まあ、gets()なんて使うとバッファオーバーフロー攻撃を受けるとか,
エラーチェックが手抜きとか、そういう問題はありますし、
その上、思いついたのを書き下ろしただけで、
コンパイルはおろか、ちゃんと動くかもわかりません(^^;;;;


でも、私が使い捨てレベルのプログラムを書くときにはよく使ってます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2002/04/26 21:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qchar c = 'a'; char h[1] = c; エラー

char型のものを char[]型に代入したいです。

char c = 'a';
char h[1] = c;

として、

h[0] は \x97
h[1] は \x00

にしたいです。
型変換の方法を教えてください。

Aベストアンサー

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数を確保します。
後半で、その中を初期化しています。
添え字は 0 からはじまるので、この場合、h[0] に c の内容が代入されます。
1個しか場所を確保していないので、 h[1] の位置のデータは内容が不定です。
文字列として h を扱いたいのであれば、 C の文字列には終端として 0 が必要ですから、
char c = 'a';
char h[2] = { c, '\0'};

のような書き方が必要になります。
これで、お望みのデータになると思います。

とりあえず、確認を。

C では、'a'の表す値は 0x61 = 97 であって、 \x97 ではないと思います。
(\xnnn を、十六進数の意味に取りましたが、あってますでしょうか?
この場合、C では通常 0xnnn のように書くと思います。)
ので、 これは 0x61 のことをおっしゃっていると仮定します。

> char h[1] = c;
っと、これではたぶんコンパイルが通りません。

char h[1] = {c};

のように、配列であることを明示して代入してください。
この式では、前半でh という名前の、*長さ1 の* char の配列変数...続きを読む

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Qfor(int i = 100, long n = 1; i > n/3i; i++)

for(int i = 100, long n = 1; i > n/3i; i++)
のように、初期設定で型の違う変数を宣言したいんだけど
C++ではこんなふうに2つ以上の型を宣言してはいけないんですか?

Aベストアンサー

,

コンマ演算子の原理です。
forの初期化文で "," で区切れるのは値を返す文だけです。
よってintステートメントもlongステートメントも値を返さないので、この文では使用できません。

というか、むしろ、intステートメントの第2引数としてlongが認識されてしまいます。
外で

int i; long n;

とし

for(i = 0, n = 0; hoge; hoge)

なら可能です。

Qファイル(A)を読み込んで文字列を変数に代入、変数で別ファイル(B)を検索・・・

お世話になっております。
まず、仕様から書かせて頂きたいと思います。
【ファイルA】
商品名 数量
-------------
AAA, 3
BBB, 5
CCC, 6
AAA,5
.
.
.
【ファイルB】
AAA,11111
BBB,12345
CCC,99999
.
.
.
【ファイルC】
商品コード 数量
------------------
11111 8
12345 5
99999 6

(1)ファイルAを読込み、アルファベット文字列を変数に代入
(2)変数でファイルBを検索 (ファイルAの最後まで検索)
(3)検索してみつかったら 数字文字列(商品コードとします)に変換
(4)商品コードと、数量の合計をファイルCに出力

fgets、strcmpなどを使って試してみたのですが、
うまく行かず、教えていただけますでしょうか?

Aベストアンサー

私なら
このデータ群を表せる構造体を定義してファイルAのデータを集計
ファイルBのデータから コードを挿入
出来上がった構造体の配列(またはリスト)から ファイルCを生成
といった手順で組みますけど ・・・

Qプログラムで得られたdataをfileに書込みたい

windowsXPで、コンパイラはボーランドのを使用しています。
プログラム中で、

for(i=1;i<10;i++)
{
printf("%f",x[i]);
}

と書いておいたら、
コマンドプロンプトにその結果が表示されます。
コマンドプロンプトに結果を書くのではなく、
指定したファイルに結果を書かせるコマンドがUNIXにはあると思うのですが、(学校ではLINUXを使っています)
そのコマンドを私の環境で使うようにできるでしょうか?
それがどのようなコマンド名だったか覚えていないのですが、
ご存知のかた、よろしくお願いします。

Aベストアンサー

プログラムで、直接ファイルに書くのは
No1さんが書かれている fprintfを使います。

また、リダイレクトという方法もあり
例えば、ls の結果をファイルにしたいのであれば
ls > filename
とすれば、ls の結果がfilename というファイルに
作成されます。

ls >> filename というようにすれば
追記されます。


人気Q&Aランキング

おすすめ情報