ページ 11

在庫管理のプログラミング

Posted: 2011年12月04日(日) 17:58
by ちょこ
在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、新たな在庫ファイル "zaiko_new.txt" を出力するプログラムを作りたいのですが上手くいきません。調べてみて、同じような質問もありましたが出来ませんでした。よろしくお願いします。
zaiko.txt
0001 19
0023 4
0050 6
0079 66
0221 1
0245 3

%more nyuko.txt
0023 5
0079 2
0221 23
0623 56

コード:

#include<stdio.h>
#include<stdlib.h>
int main(int argc,char argv[]){
   FILE *fp_z;
   FILE *fp_n;
   FILE *fp_zn;
   int kosu1,kosu2,kosu3;
   int code1,code2,code3;

   if((fp_z = fopen("zaiko.txt","r"))==NULL){
      printf("エラー:ファイル%sを読み込めません\n",argv[1]);
      exit(1);
   }
   if((fp_n = fopen("nyuko.txt","r"))==NULL){
      printf("エラー:ファイル%sを読み込めません\n",argv[2]);
      exit(1);
   }
   if((fp_zn = fopen("zaiko_new.txt","a"))==NULL){
      printf("エラー:ファイル%sを読み込めません\n",fp_zn);
      exit(1);
   }
   
   while(fscanf(fp_z,"%d %d",&code1,&kosu1) == 2){
      while(fscanf(fp_n,"%d %d",&code2,&kosu2) == 2){
         if(code1 == code2){
            code3 = code1;
            kosu3 = kosu1 + kosu2;
            fprintf(fp_zn,"%d %d\n",code3,kosu3);
         }
         else{
            code3 = code2;
            kosu3 = kosu2;
            fprintf(fp_zn,"%d %d\n",code3,kosu3);
         }
      }
   }


   fclose(fp_z);
   fclose(fp_n);
   fclose(fp_zn);
}

Re: 在庫管理のプログラミング

Posted: 2011年12月04日(日) 18:24
by jay
ちょこ さんが書きました:在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、新たな在庫ファイル "zaiko_new.txt" を出力するプログラムを作りたいのですが上手くいきません
その"zaiko_new.txt" というものの仕様がよくわかりませんね。
ただ単に"zaiko.txt" と"nyuko.txt"から読み込んだものをそのまま書きだすだけなのか
然るべき処理をした後に書きだすのか。 もしそうなら具体的にどのような処理をすればいいのか
その辺りの情報が全くないので具体的にアドバイスをするのはかなり難しいですね・・・。
できればその辺りの情報をもう少し詳しくお願いします。

とりあえず、何故だかfscanf関数とfprintf関数が同じループ処理の中に組み込まれているみたいですが
特に理由がないのなら処理は一つ一つ分けて書いて行った方がいいですよ

その方が大体コードも読みやすくなりますし、不具合が起きても原因の解明が楽になりますしね。

Re: 在庫管理のプログラミング

Posted: 2011年12月04日(日) 19:26
by box
ちょこ さんが書きました:上手くいきません。
これまで、いろんなところで言い尽くされているようなことではありますが、
単に「うまくいきません」と書いてあるだけでは、事実上「何も言っていない」のと同じです。
何がどううまくいかないかを、「具体的に」書いてください。
ちょこ さんが書きました:

コード:

int main(int argc,char argv[]){
第2引数の書き方は、本当に正しいですか?
ちょこ さんが書きました:

コード:

   if((fp_z = fopen("zaiko.txt","r"))==NULL){
      printf("エラー:ファイル%sを読み込めません\n",argv[1]);
argv[1]と"zaiko.txt"との関係は、どうなっていますか?
ちょこ さんが書きました:

コード:

   if((fp_n = fopen("nyuko.txt","r"))==NULL){
      printf("エラー:ファイル%sを読み込めません\n",argv[2]);
argv[2]と"nyuko.txt"との関係は、どうなっていますか?
ちょこ さんが書きました:

コード:

   if((fp_zn = fopen("zaiko_new.txt","a"))==NULL){
      printf("エラー:ファイル%sを読み込めません\n",fp_zn);
fp_znを"%s"で出力することに、どのような意味がありますか?

Re: 在庫管理のプログラミング

Posted: 2011年12月04日(日) 19:43
by non
マッチング処理かトランザクション処理で検索すると参考になるものが出ると思います。

ヒントとして
キー(code)として、最大の数をMAX_VALUEとして定義し、読むデータがなくなった時にcodeにMAX_VALUEを入れる。
whileは1つにする。ループ条件は、code1<MAX_VALUE || code2<MAX_VALUE

Re: 在庫管理のプログラミング

Posted: 2011年12月04日(日) 20:05
by ちょこ
説明不足ですいません。
"zaiko_new.txt"は"zaiko.txt"と"nyuko.txt"の商品コード(4桁)と数量を書き込み、もし商品コードが同じものがあれば、数量を合計したものを書き込みます。
box さんが書きました:これまで、いろんなところで言い尽くされているようなことではありますが、
単に「うまくいきません」と書いてあるだけでは、事実上「何も言っていない」のと同じです。
何がどううまくいかないかを、「具体的に」書いてください。
上記のプログラムでは"zaiko_new.txt"に"nyuko.txt"のデータしか入りませんでした。
box さんが書きました:argv[1]と"zaiko.txt"との関係は、どうなっていますか?
コンパイル時に./~.out zaiko.txt nyuko.txtと書くのでargv[1]は"zaiko.txt"をargv[2]は"nyuko.txt"を指しています。

その他、もう一度見直してみます。