こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

配列の比較について・・・困ってます・・。

ご質問させていただきます。
これは、fin2というファイルから数値を抜き出し配列に格納して、finの文字列と比較し、その文字列のある場所で配列の数値と比較し、合致したら、ある出力をするというものなんですが、
配列に格納した数値が、
a[1]=[123] b=[234]
a[1]=[345] b=[400]
というふうに増えていくときは問題ないですが、途中でたとえば
a[n]=100 b[n]=400
a[n+1]=300 b[n+1]=358
という風にn+1番目のaより、n番目のbが大きいときに、止まってしまうんです、これをうまく処理して最後まで比較させたいんですが、どうしてもうまくいきません。どなたかたすけてください。やはり、
n==b[yabu]の処理の後になんか書けばいいんでしょうか?長々と申し訳ございませんでした。

if(fin2!=NULL)
{
int yabu=0;
for(int i=0; fgets(c,CHARMAX,fin2)!=NULL;i++)
{
sscanf(c,"%d%*c%*c%d",&a[yabu],&b[yabu]);
fprintf(fout2,"%d::::::::::::::%d:%d\n",yabu,a[yabu],b[yabu]);
yabu++;
}
}

int yabu=0;
n=0;
while(fgetc(fin)!=EOF)
{
n++;
if(n==a[yabu])
{
fprintf(fout2,"A ");
}

else if(n==b[yabu])
{
fprintf(fout2,"B ");
yabu++;}

else
{fprintf(fout2,"C ");
}

}

printf("%d\n",yabu);

投稿日時 - 2002-02-10 00:22:27

QNo.214994

すぐに回答ほしいです

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

こんにちは。itohhといいます。

もし、固定で良いのでしたら、補足で書かれているように配列に持っておくほうが楽ですね。

char strData1[]={(char)0x90,
          (char)0x3C,
          (char)0x40,
          (char)0x83,
          (char)0x60,
          (char)0x80,
          (char)0x3C,
          (char)0x00};

   :
   :
   :

fwrite( strData1, sizeof( char ), sizeof(strData1), fout2 );

strlen(strData1)では、最後の0x00を数えてくれません、ですからsizeof(strData1)ですね。


strData1を必要な分だけ用意しておくと良いのではないでしょうか。
strData2,strData3などなど。

こんなとこでしょうか?

投稿日時 - 2002-02-19 00:14:54

お礼

どうもありがとうございました。長期間にわたり回答寄せてくださってありがとうございました!!!
おかげさまで、いろいろ勉強することができました!!また、わかんないことがでてきたらここで質問してべんきょうしていきたいと思います。
本当にありがとうございました!!

投稿日時 - 2002-02-19 16:25:24

ANo.21

このQ&Aは役に立ちましたか?

8人が「このQ&Aが役に立った」と投票しています

回答(21)

ANo.20

こんにちは。itohhといいます。

>903C408360803C00という文字列
なんか凄いデジャビュを感じるので過去の回答を検索してみたら
同じことを聞かれたのを思い出しました。
これは、単なる偶然ですよね!


以下の質問でわたしが一度アドバイスしていますのでそちらを参考にしてください。

この方法では、ダメということなら、再度、補足してください。

・質問:バイナリファイルの書き出し
URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=175147

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=175147

投稿日時 - 2002-02-18 17:26:04

補足

なんか、驚きました!!MIDIデータいじくってる人って意外にいるもんですね。
ところで、あのプログラム鬼のようにむずかしいっす。
じっくり解読してみますが、もっと手軽にできる方法ってありません?
あのプログラムとこのプログラムを合体させるだけでも難しそう・・。
・・なんか凄いですね!!なかなか私にはかけたもんじゃないです・・(泣)
わがままばっかりですみません・・・・。

投稿日時 - 2002-02-18 18:01:59

ANo.19

こんにちは。itohhといいます。

すみません、言い忘れたことがあります。

malloc関数で動的に配列を獲得した場合は、使い終わったときに解放することを
忘れずにしてください。

>lpBuf = (char*)malloc( lLen+1 );
  :
  :
  :
  :
>fwrite( lpBuf, sizeof( char ), lLen, fout2 );

// 関数で使い終わったときに解放する。
free( lpBuf );

投稿日時 - 2002-02-17 12:13:14

補足

ご丁寧な回答ありがとうございました!!!!
非常によく全体の、構造がわかりました!!!!!
・・・・・で、なんですが、ここで追加質問するのもどうかとおもったんですが、
今は、A,B,Cをテキストに出力してますよね?
これを、バイナリに出力したいんです。
いままで、903C408360803C00という文字列をバイナリに出力するとき、
C[0]=0x90 C[1]=0x3C・・・・という風に配列を用意して
fwrite(C,8,1,fout);という風にしてました。
これをlpBuf[a[i]-1]='A';のとこで
903C408360803C00を出力したいんです。そのままやってもだめなようなんで・・。
なにか、うまい方法ってありますか?

度々すみません。これで最後にしたいと思います。
また、疑問でてきたら新たに質問しなおしたいとおもいます。

投稿日時 - 2002-02-18 15:16:14

ANo.18

こんにちは。itohhといいます。

ソースを見てみました。
>if(fin2!=NULL)                 <-----(0)
>{
>int yabu=0;                   <----(1)
>for(int i=0; fgets(c,CHARMAX,fin2)!=NULL;i++)
>{
   :
   :
>yabu++;                     <----(2)
>}
>}
   :
   :
>int yabu=0;                   <----(3)
>long lLen=0;
>char *lpBuf=NULL;
>if( (fin = fopen( "sample.txt", "r" )) != NULL ) { //sample.txtはfinファイル名
   :
   :
>for(i=0; i<yabu; i++ ) {            <----(4)
   :
   :
> }
  :
  :

yabu変数を考えてみてください。
最終的に、yabu変数の中に入っている値によってforループの回数が変わります。(4)
yabu変数は、(2)でfin2ファイルを読み込むときにカウントアップされていますよね?

今度は宣言するところを見てみると、2カ所あります。(1)(3)

(1)の宣言では、(0)のifブロック内にありますからこのブロックを抜け出たときに
スコープがはずれそれ以降は使えなくなります。


しかし、(3)で再度宣言がされているため(4)で使用することが出来るのです。
ですが、一度、スコープがはずれているため、折角カウントした値はクリアされています。
(forループがゼロ回しか廻らないことになる)

使う直前に変数を宣言することを薦める人もいますが、まだなれていない人には間違いの
元ですから、関数内で使用する変数の宣言は全て先頭で行うことをお薦めします。

まとめますと。
(1)では宣言をやめる。

int aaaaaa()     <---------関数の先頭
{
 int yabu=0;
 long lLen=0;
 char *lpBuf=NULL;
 FILE *fin;
 FILE *fin2;
 int i=0;
 (その他の宣言を行う)
  :
 
 
 

 if(fin2!=NULL)                 <-----(0)
  :
  :


}

投稿日時 - 2002-02-17 12:02:52

ANo.17

tgb

 ANo.#13の注意点にも書いたようにcc[]の宣言位置に注意
する必要があります。cc[]の宣言が現在localになっている
と思いますが、local変数に対してはメモリーに制約がある
ようで、大きなサイズは宣言できません。globalにして関数
の外で宣言すると100万や1000万位はOKだと思います。
マシンのメモリー要領による制約もありますので確認して
ください。(この辺の詳しい事は私も余りよく知りません。)

 実際に100万の文字を読み込むのなら、私の方法より
itohhさんの方がよいのではないかと思います。

 プログラムが質問で提示されたもので全て(つまり、質問
のために縮小されたものを作って提示したのではない)なら、
finのファイルから読み込まれる文字データは全く未使用で
文字データの個数のためのみにfinにアクセスしていることに
なりますので、何らかの別の方法でこの文字数が分かれば
そちらを参照するようにする事を検討された方がよいと思い
ます。取りあえず現在の方法でやって行くことは可能は可能
です。

投稿日時 - 2002-02-17 10:47:25

お礼

どうもありがとうございました。大きさの問題ってむずかしいです・・・・。
とりあえず、このプログラムでやっていって、また別に勉強していきたいと思います!!どうも、ありがとうござました!!

投稿日時 - 2002-02-18 15:04:27

ANo.16

tgb

失礼しました。
char cch[4]={"ABC"};
または
char cch[]={"ABC"};
としてください。

投稿日時 - 2002-02-16 08:47:25

補足

またしても、質問で申し訳ないですが、char cc[]の部分の配列の数についてなんですが、一般的にこれって限界の数ってあるんでしょうか?
たとえば1000000ぐらいにするとまともに動かないんですが・・・。
ちなみに環境はVC++6.0です。

投稿日時 - 2002-02-17 00:54:48

お礼

ご回答ありがとうございます。
素早いお返事本当に嬉しいです。
早速、やってみます。ポイントもうちょっと、待って下さい。

投稿日時 - 2002-02-16 09:08:59

ANo.15

こんちには。itohhといいます。

すみません、(3)の処理でfinファイルの長さを越える処理が入っていませんでした。

for(i=0; i<yabu; i++ ) {
  if( a[i] <= lLen ) {
    lpBuf[a[i]-1] = 'A';
  }
  if( b[i] <= lLen ) {
    lpBuf[b[i]-1] = 'B';
  }
}

投稿日時 - 2002-02-12 12:53:34

お礼

ご回答ありがとうございます。
返事がおそくなって申し訳ございませんでした。
で、早速やってみたんですが、下のtgbさんに対するレスでもかいたんですが、
初期化子の数が多すぎるといったエラーがとれないんですが、なにかが
いけないんでしょうか?

投稿日時 - 2002-02-16 02:08:48

ANo.14

こんにちは。itohhといいます。

先ほどは、時間がなかったのでサンプルを載せることが出来ませんでした。
改めて、じっくり解説します。

(1)fgetc(fin)したデータを使用していないので、まずは、finファイルのサイズを測ることにします。
(2)finファイルのサイズ分のエリアを確保して初期クリアします。
   (この後は、ほぼtgbさんと同じ回答です。)
(3)tgbさんが回答したように"A"、"B"を動的配列に設定していく。
(4)A,B,Cを設定した動的配列を出力する。


FILE *fin;
long lLen=0;
char *lpBuf=NULL;

// (1)の処理
if( (fin = fopen( "fin.dat", "r" )) != NULL ) {
  fseek( fin, 0, SEEK_END ); // ファイルの最後に移動する
  lLen = ftell( fin ); // 現在のファイルポインタの位置を取得する(ファイルサイズ)
  fclose( fin );
}

// (2)の処理
lpBuf = (char*)malloc( lLen+1 ); // ファイルのサイズ+1分のエリアを確保。
memset( lpBuf, 0x00, lLen+1 );
memset( lpBuf, 'C', lLen ); // 'C'で初期クリア

// (3)の処理
for(i=0; i<yabu; i++ ) {
// 省略します。

}

// (4)の処理
fwrite( lpBuf, sizeof( char ), lLen, fout2 );

こんな感じではどうでしょうか?

投稿日時 - 2002-02-12 12:42:35

補足

こんばんは。結局このプログラム考え抜いたんですが、どうしてもむずかしくておてあげです。以下のようにやるとCしか出力されません・・・・。
何度もお恥ずかしいんですが、なにか根本的に間違ってます?お時間あれば教えてください・・・。

if(fin2!=NULL)
{
int yabu=0;
for(int i=0; fgets(c,CHARMAX,fin2)!=NULL;i++)
{
sscanf(c,"%d%*c%*c%d",&a[yabu],&b[yabu]);
fprintf(fout2,"%d::::::::::::::%d:%d\n",yabu,a[yabu],b[yabu]);
yabu++;
}
}
int yabu=0;
long lLen=0;
char *lpBuf=NULL;
if( (fin = fopen( "sample.txt", "r" )) != NULL ) { //sample.txtはfinファイル名
  fseek( fin, 0, SEEK_END );
  lLen = ftell( fin );
  fclose( fin );
}

lpBuf = (char*)malloc( lLen+1 );
memset( lpBuf, 0x00, lLen+1 );
memset( lpBuf, 'C', lLen );

for(i=0; i<yabu; i++ ) {
  if( a[i] <= lLen ) {
    lpBuf[a[i]-1] = 'A';
  }
  if( b[i] <= lLen ) {
    lpBuf[b[i]-1] = 'B';
  }
}
fwrite( lpBuf, sizeof( char ), lLen, fout2 );

投稿日時 - 2002-02-17 01:51:44

ANo.13

tgb

 ANo.#11の補足を読むとA(800)やB(850)をfinファイルの何番目文字
として出力するのか曖昧になってしまいます。
「a[],b[]にある数値に対応した位置にそれぞれA、Bを出力し、
それ以外ではCを出力する。その際、数値が必ずしも単調に
増加するとは限らない」
と言う条件では行けないのでしょうか?

 上のような前提で処理例を示しますのでやってみていただけ
ないでしょうか?
 a[],b[]を読み込んだ後、以下のようにしてください。

int n=0;
int i,k;
char cch[3]={"ABC"};
char cc[1000];
while(fgetc(fin)!=EOF) {cc[n]=cch[2];n++;}
for(i=0;i<yabu;i++){
k=a[i]-1;cc[k]=cch[0];
k=b[i]-1;cc[k]=cch[1];
}
for(i=0:i<n;i++)fprintf(fout2,"%1c ", cc[i]);

注意点:
・cc[1000]のサイズ1000をfinファイルにある文字数より大きな
 値に適当に修正してください。
・a[]、b[]に同じ数値があるときは"B"が出力されます。
・fin2を読み込むときに設定したyabuの値をそのまま使用します。
・cc[]のサイズが大きいときは宣言の位置を適当に変えてください。

投稿日時 - 2002-02-12 11:28:26

お礼

お返事おそくなって申し訳ございません。パソコンがこわれちゃったんで・・・。
で、早速、やってみたんですが、
char cch[3]={"ABC"};
のところの、エラーで、「初期化子の数が多すぎます」というエラーが取れません。なにがいけないんでしょうか?

投稿日時 - 2002-02-16 02:06:39

ANo.12

こんにちは。itohhといいます。

前から思っていたのですが、finファイルを実際に読む必要性がないのではないでしょうか?
finファイル内のデータを使うのではなく、データの長さだけが必要なのですよね?

finファイルとは、例えば"fin.dat"みたいにプログラムが動く前に実在するファイルなのですよね?
finファイルの長さを測ってその長さ以内のa,bを順に出力するのではいけないのでしょうか?

投稿日時 - 2002-02-12 10:11:05

ANo.11

こんにちは。itohhといいます。

>130..344
>500..600
>700..999
>800..850
この場合は、どのように出てほしいのでしょうか?

A(130)
B(344)
A(500)
B(600)
A(700)
A(800)
たぶん、上記のようになって終わってしまうと言うことですよね?

この後、
B(999)
B(850)
と出てほしいのでしょうか?

それとも
A(130)
B(344)
A(500)
B(600)
A(700)
B(999)  <--追加
A(800)
B(850)  <--追加
と出てほしいのでしょうか?

投稿日時 - 2002-02-11 23:05:21

補足

ご回答ありがとうございます。
この場合は
A(130)
B(344)
A(500)
B(600)
A(700)
B(999)  <--追加
A(800)
B(850)
というふうに出したい んです。つまり、fin2の ファイルには上から順に一行に二つ数字があるんですけど、それをaとbというふたつの配列に読み込んでますよね?それを一行分ずつ上から順に出力したいんです。つまり、配列に格納された数字の大きさを中心に考えるのではなくて、一行分ずつ出力していきたいんです。重ねがさね恐縮ですが、アドバイス頂けたら嬉しいです。

投稿日時 - 2002-02-12 01:20:33

ANo.10

こんにちは。itohhといいます。

>一部データ中には途中で減少する箇所があるんです
finファイルも全て読み込んでしまうことはできないのですか?
全て読み込んだ後ならば、簡単に出来ると思いますよ。

やっぱり、減少するところも含めて順番に出力したいのですよね?
もし、順番は気にしないのでしたらば、fin2ファイルの配列をソート(並べ替え)
した後にfinファイルと比較するという手もあります。

どちらもだめでしょうか?

投稿日時 - 2002-02-11 21:30:46

補足

御回答ありがとうございます。
全部読み込んでいくことはできるんですが、たとえば
130..344
500..600
700..999
800..850
みたいな感じで並んでるところがあったら、それ以降すべての出力がAのみに
なっちゃうんです。
 ifの処理をwhile()からはずして書くということなんでしょうか?

投稿日時 - 2002-02-11 21:59:22

ANo.9

tgb

 うまく行ってよかったですね。
 単調増加でない場合は一度”C”を出力してしまっている所に
”A”、”B”を出力することになるので、そう言うことを想定
しないと言うことです。
 一度書き出した箇所に重ねて出力することも可能ですが、書き
出す前に全て見て調べておいて小さい順に並べた後出力すると言う
ことも考えられます。処理は多少煩雑になると思います。

投稿日時 - 2002-02-11 19:29:43

お礼

御回答ありがとうございました。おかげさまでたすかりました!!
あと、もう一歩です。
減少の時の謎さえとければ・・・・・。
がんばってみたいとおもいます。

投稿日時 - 2002-02-11 22:15:28

ANo.8

こんにちは。itohhといいます。

>fin2の配列の中の数字と比較したいのはfinの中の文字そのものというよりもその
>finの中の文字が何番目かということを比較したいんです。

これは、finファイルの中から配列(fin2ファイル)の数値の位置のバイトを
抜き出したいのでしょうか?

tgbさんの回答とだぶってしまうんですけど、else if文を使うことによって
フラグ(k)を使わなくて良いですよ。

int n=0;

yabuA=0;
yabuB=0;

data = fgetc(fin);

for(n=0; feof(fin) == 0; n++ )
{
 if( n == a[yabuA] )
 {
  fprintf(fout2,"A [%c]", data);
  yabuA++;
 }
 else if( n == b[yabuB] )
 {
  fprintf(fout2,"B [%c]", data);
  yabuB++;
 }
 else
 {
  fprintf(fout2,"C ");
 }
 data = fgetc(fin);
}

投稿日時 - 2002-02-10 23:18:57

お礼

度々、お返事ありがとうございます。
フラグを使わない方法もやってみました!!なんか、使い慣れてないんで
こっちの方がピンと来ます。両方わかればいいんですが・・・。
ところで、各々の配列が単調増加ならば問題ないんですが、一部データ中には途中で減少する箇所があるんです・・・・・。
その時って、if文の中にさらにif文を書いて・・・・みたいにやってみたんですが、エラーの嵐になってうまくいかないんです・・・。
こういう場合って非常に難しくなるんでしょうか?

投稿日時 - 2002-02-11 18:59:26

ANo.7

tgb

itohhさんの指摘は私も疑問に思いました。
finからのデータについては
出力する文字A、B、Cの合計数をいくつにするかには寄与しますが
finの文字データは全く使っていませんので、質問文の内容とは食い違います。
しかし、ANo.#4の補足から質問の内容が違っていたと理解されます。
行いたい処理をまとめますと
fin2から読み込んだ数値データを
左側数値nl...その場所(nl文字目)にAを出力
右側数値nr...〃   (nr文字目)にBを出力
上の数値以外.............. Cを出力
となるのでしょうか。そうなら以下のように出来ると思いますが。
ただし、
  a,bともそれぞれに単調に大きくなること、
  a,bに共通する数値が入らないこと
を前提します。
(今回問題になったaとbとの大小関係はクリアされる筈です)

int yabuA=0,yabuB=0;
int n=0;
int k;
while(fgetc(fin)!=EOF)
{
n++;
k=1;
if(n==a[yabuA])
{
fprintf(fout2,"A ");
yabuA++;
k=0;
}


if(n==b[yabuB])
{
fprintf(fout2,"B ");
yabuB++;
k=0;
}
if(k) fprintf(fout2,"C");
}

大変そうですが頑張ってください。

投稿日時 - 2002-02-10 21:47:24

お礼

御回答ありがとうございます。
これで、やってみたらうまくいきました。
フラグっていうのは使ったことないんでしたが、これを機にもっと
勉強してみようと思います!!
ところで、これは各々が単調増加する場合でしたが、途中で
aもしくはbが減少した場合は、だめですよね?
減少するという場合も考えられるんですが、その時は、
if(n==b[yabuB])
{
}
の中にさらに
if文とかで、条件を分けて、b[yabuB-1]<b[yabuB]の時・・・
みたいにする事って可能なんでしょうか?
かいてはみたもののエラーだらけになっちゃいます。

投稿日時 - 2002-02-11 18:55:55

ANo.6

こんにちは。itohhといいます。

>一文字ずつ読んでいくということはfin内のデータを使ってる
>事となんらないんでしょうか?

以下のソースを見ると、fgetcで読み込んだ1バイトの値はどこに格納されるのでしょうか?
if文で比較している値は、nとa[yabu]ですよね?
nは単純に0から1づつ増えていくカウンタですよね?
>while(fgetc(fin)!=EOF)
>{
>n++;
>if(n==a[yabu])
>{
>fprintf(fout2,"A ");
>}

もし、finファイルを読み込んで比較したいのなら

char data;
int yabu=0;
int i=0;
long a[100]. b[100];

 for(i=0,yabu=0; fgets(c,CHARMAX,fin2)!=NULL;i++)
 {
  sscanf(c,"%d%*c%*c%d",&a[yabu],&b[yabu]);
  fprintf(fout2,"%d::::::::::::::%d:%d\n",yabu,a[yabu],b[yabu]);
  yabu++;
 }


 data = fgetc(fin);
 while(feof(fin) == 0 ) {
  // a,b配列と比較する
  for(i=0; i<yabu; i++ ) {
   if( data == a[i] )
   {
    fprintf(fout2,"A ");
    break;
   }
   if( data == b[i] )
   {
    fprintf(fout2,"B ");
    break;
   }
  }
  // a,bにヒットしなかった場合
  if( i == yabu )
  {
   fprintf(fout2,"C ");
  }
  data = fgetc(fin);
 }

こういうことが、やりたいことなのではないでしょうか?

インデントするために全角スペースを行の先頭に入れています。

投稿日時 - 2002-02-10 19:13:50

補足

お返事ありがとうございます。
早速やってみました。これだとfinのデータそのものと比較することになりますよね?
fin2の配列の中の数字と比較したいのはfinの中の文字そのものというよりもそのfinの中
の文字が何番目かということを比較したいんです。その場合もこういう風にするんでしょ
うか?なんか実行結果がうまくいかないんで混乱してしまいました。何度も恐縮ですが教
えて頂けたら嬉しいです。

投稿日時 - 2002-02-10 20:41:16

ANo.5

tgb

ANo.#3のtgbです。
申し訳ありません。余計なことなのですが、念のため補足
させていただきます。
a[]とb[]のそれぞれの比較を行うとき、if文で
elseを使わないでください。つなぐと独立な処理に
ならなくなります。(私の示した例ではelseは入れて
いません)

投稿日時 - 2002-02-10 10:49:22

お礼

ありがとうございます。
if-elseは使わないんですね!?
ありがとうございました!!!!!!!!!!!1

投稿日時 - 2002-02-10 17:48:28

ANo.4

こんにちは。itohhといいます。

>そして、こんどはfinファイルを読みます。このfinは半角英字のみが延々と
>かかれているファイルで、これを頭から一文字ずつ読んでいって、
>a[0]に格納された数値と一致したなら、 cout<<"A"の処理をし

ここの処理がちょっと判らないのですが。
「finの1文字(半角英字)とa[0]に格納された数値を比較する」
と言うことは
「半角英字のasciiコードとa[0]に格納された数値を比較する」
という意味でしょうか?

ソースを見る限り
>if(n==a[yabu])
>{
>fprintf(fout2,"A ");
>}
a[yabu]に123が入っているとしたらn(カウンタ)が123までループしたらfprintf文
が実行されるとなっています。
もし、このままでいいのでしたらfinファイルを読み込む意味がないのではないでしょうか?
finファイル内のデータをぜんぜん使っていませんよ。

投稿日時 - 2002-02-10 10:48:42

補足

御回答ありがとうございます。
基本的にはそういう処理をしていくんですが、そのfinに入っている、データ(半角英数字)は、4種類あるんですが、それぞれによって、出力を変えたいんです。
でも、一度に考えるとこんがらがるのでとりあえず、今のような書き方にしてるんです。

>finファイル内のデータをぜんぜん使っていませんよ。

一文字ずつ読んでいくということはfin内のデータを使ってる事となんらないんでしょうか?やっぱり、finファイルの存在自体は必要ですよね?

投稿日時 - 2002-02-10 17:40:24

ANo.3

tgb

処理内容がよく分かっていないので的確な指摘かどうか分かりませんが、
a、bの参照用の変数yabuを独立にしてみたらいかがでしょうか?

int yabuA=0,yabuB=0;
int n=0;
while(fgetc(fin)!=EOF)
{
n++;
if(n==a[yabuA])
{
fprintf(fout2,"A ");
yabuA++;
}

if(n==b[yabuB])
{
fprintf(fout2,"B ");
yabuB++;}
.......

投稿日時 - 2002-02-10 10:02:53

補足

御回答ありがとうございます。変数をわけてみればいいんですか・・・・。
早速、やってみたいと思います。
ありがとうございました!!!

投稿日時 - 2002-02-10 17:45:31

ANo.2

こんにちは。itohhといいます。

すみません、一部ソースを読み違えました。
>まず、このソースはコンパイルエラーになりませんか?
>>for(int i=0; fgets(c,CHARMAX,fin2)!=NULL;i++)
>fgetsの文法が間違っています。
わたしの勘違いでした、ごめんなさい。

投稿日時 - 2002-02-10 01:17:30

ANo.1

こんにちは。itohhといいます。

処理の内容がいまいち判らないのですが。

1.2つのファイルを読み込む。
2.1行の内容はa,bの2つの値が格納され複数行入っているので配列に格納する(fin2ファイル)
3.チェックしたい値が1行に1個入っている(finファイル)
4.3.の値を1つずつ2.の配列のaなのかbなのかをチェックしたい。

これでよいのでしょうか?

まず、このソースはコンパイルエラーになりませんか?
>for(int i=0; fgets(c,CHARMAX,fin2)!=NULL;i++)
fgetsの文法が間違っています。


>sscanf(c,"%d%*c%*c%d",&a[yabu],&b[yabu]);
"%d%*c%*c%d"と&a[yabu],&b[yabu]の数があっていません。
fin2ファイルの中のフォーマットはどのようになっているのでしょうか?

>while(fgetc(fin)!=EOF)
fgetsの文法が間違っています。(読み込んだデータはどこに格納するのでしょうか?)

2つ目のループはfinファイルがEOFまでループしますが、
比較しているのはカウンタ(n)ですよね?これで良いのですか?
finファイルのデータは関係ないのでしょうか?

投稿日時 - 2002-02-10 01:09:50

補足

御回答ありがとうございます。コンパイルエラーになりませんよね?
びっくりしちゃいました(笑)
処理としては、
fin2ファイルは、
123..234 [英数字の羅列・・](改行)
300..434 [英数字](改行)
523..674 [英数字](改行)
800..934 [英数字](改行)・・・・・
みたいになってて、そこから数字だけをぬきだして、左の数字をa[yabu]に
右の数字をb[yabu]に格納します。
そして、こんどはfinファイルを読みます。このfinは半角英字のみが延々と
かかれているファイルで、これを頭から一文字ずつ読んでいって、a[0]に格納された数値と一致したなら、 cout<<"A"の処理をして、・・・というふうにやっています。・・・・とこのままだとfin2の数値が、単純に増加していけば問題ないのですが、途中でb[n]の数字の方がつぎのa[n+1]よりも大きくなってしまった場合そこで止まっちゃうんです。
123..234 [英数字の羅列・・](改行)
300..434 [英数字](改行)
523..1002 [英数字](改行)
800..934 [英数字](改行)・・・・・
とかいうばあい、3行目で止まっちゃうんです。
いろいろ考えたんですが、なんとかここまではこぎつけたものの、こっから
先がわかんないんです・・・・・。
itohさんのお力をかしてください!!よろしくお願いいたします。

投稿日時 - 2002-02-10 01:24:41

あなたにオススメの質問