大学のC言語の課題で、どうしても出来ない課題があります。
その課題内様は、『前日商品別に在庫を登録したファイル "zaiko.txt" と当日商品別に入庫を記録したファイル "nyuko.txt" の2つのファイルを入力し、新たな在庫ファイル "zaiko_new.txt" を出力するプログラムを作成せよ。また、ファイルの各レコード(行)は次の形式で、ひとつの商品に対してひとつのレコードとする。
商品コード 整数 4桁
数量 数字 4桁
さらに、各ファイルは商品コードの昇順にソートされているものとする。』というものです。
サイトや教科書でいろいろ調べたのですが、全く分かりませんでした。
どなたか教えていただけないでしょうか。
%more zaiko.txt
0001 19
0013 13
0029 24
0048 9
0052 6
0070 7
0074 34
0149 21
0203 8
0226 1
1129 36
1802 7
2207 9
%more nyuko.txt
0048 6
0074 5
0142 22
0326 44
% cc -o kadai_5-4 kadai_5-4.c
% ./kadai_5-4 zaiko.txt nyuko.txt zaiko_new.txt
% cat zaiko_new.txt
0001 19
0013 13
0029 24
0048 15
0052 6
0070 7
0074 39
0142 22
0149 21
0203 8
0226 1
0326 44
1129 36
1802 7
2207 9
在庫処理のプログラミング(ファイル)
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: 在庫処理のプログラミング(ファイル)
課題との事なのでソースコードは控えさせていただいて、流れとしては以下のようになると思います。
1.「zaiko.txt」「nyuko.txt」ファイルをオープンします。(要エラーチェック)(fopen)
2.両ファイルの内容を読み込みます。(fscanf)
3.nyukoの内容を、各レコードずつ既にzaikoに存在しているかをチェックします。
3-1.存在していた場合
zaiko側の情報にzaiko側の数量とnyuko側の数量を足します。
3-2.存在していなかった場合
zaiko側に新たにnyukoのレコードの情報を追加します。
4.「zaiko_new.txt」ファイルをオープンします。(要エラーチェック)(fopen)
5.zaikoの情報をソートして、「zaiko_new.txt」に書き込みます。(fprintf)
6.最後に確保したすべてのリソースを解放します。
どの時点でソートするかですが、3-2の段階で適切な位置に挿入するのも良いですね。
どこが、わからないのかを細かく言っていただいたら、もっと詳細なヒントを出せます。
[hr]
言うほど良くないので編集。
1.「zaiko.txt」「nyuko.txt」ファイルをオープンします。(要エラーチェック)(fopen)
2.両ファイルの内容を読み込みます。(fscanf)
3.nyukoの内容を、各レコードずつ既にzaikoに存在しているかをチェックします。
3-1.存在していた場合
zaiko側の情報にzaiko側の数量とnyuko側の数量を足します。
3-2.存在していなかった場合
zaiko側に新たにnyukoのレコードの情報を追加します。
4.「zaiko_new.txt」ファイルをオープンします。(要エラーチェック)(fopen)
5.zaikoの情報をソートして、「zaiko_new.txt」に書き込みます。(fprintf)
6.最後に確保したすべてのリソースを解放します。
どの時点でソートするかですが、3-2の段階で適切な位置に挿入するのも良いですね。
どこが、わからないのかを細かく言っていただいたら、もっと詳細なヒントを出せます。
[hr]
言うほど良くないので編集。
最後に編集したユーザー bitter_fox on 2010年12月03日(金) 00:25 [ 編集 1 回目 ]
Re: 在庫処理のプログラミング(ファイル)
とりあえずここまでできましたが、コンパイルエラーが出ないのにも関わらず、new_zaiko.txtになにも表示されませんT_T
どうしたらいいのでしょうか…
どうしたらいいのでしょうか…
#include<stdio.h>
#include<stdlib.h>
#define NUMBER 100
typedef struct{
int goods_code;
int number;
}pdata;
void swap(pdata *x,pdata *y)
{
pdata temp=*x;
*x=*y;
*y=temp;
}
void sort(pdata data[],int n)
{
int k=n-1;
while(k>=0){
int i,j;
for(i=1,j=-1;i<=k;i++){
if(data[i-1].number>data[i].number){
j=i-1;
swap(&data[i],&data[j]);
}
k=j;
}
}
}
int main(int argc,char argv[])
{
FILE *fp1,*fp2;
int i,j;
int kosu1=0;
int kosu2=0;
int kosu3=0;
pdata data1[NUMBER];
pdata data2[NUMBER];
pdata data3[NUMBER];
char c;
if( (fp1=fopen("zaiko.txt","r"))==NULL) {
printf("入力ファイルがオープンできません¥n");
exit(EXIT_FAILURE);
}
if( (fp1=fopen("nyuko.txt","r"))==NULL) {
printf("入力ファイルがオープンできません¥n");
exit(EXIT_FAILURE);
}
while(fscanf(fp1,"%d%d",&data1[kosu1].number,&data1[kosu1].goods_code)==2){
kosu1++;
}
while(fscanf(fp1,"%d%d",&data2[kosu2].number,&data2[kosu2].goods_code)==2){
for(i=0;i<=kosu1;i++){
if(data2[kosu2].number==data1[i].number){
data2[kosu2].goods_code=data1[i].goods_code+data2[kosu2].goods_code;
data2[kosu2].number=data1[i].number;
}
}
kosu2++;
}
for(j=0;j<=kosu1;j++){
data3[kosu3].number=data2[j].number;
data3[kosu3].number=data1[j].number;
data3[kosu3].goods_code=data2[j].goods_code;
data3[kosu3].goods_code=data2[j].goods_code;
kosu3++;
}
sort(data3,kosu3);
if( (fp2=fopen("new_zaiko.txt","w"))==NULL){
printf("入力ファイルがオープンできません¥n");
exit(EXIT_FAILURE);
}
while((c=fgetc(fp1))!=EOF){
fputc(c,fp2);
}
fclose(fp1);
fclose(fp2);
return(0);
}
- bitter_fox
- 記事: 607
- 登録日時: 14年前
- 住所: 大阪府
Re: 在庫処理のプログラミング(ファイル)
結構問題点が多いですね。
これでは、fp1が上書きされて「nyuko.txt」のファイルポインタが入ってしまいます。
「数字_数字」(_はスペース)の状態でファイルに入っているので
fscanf(fp, "%d %d", ...);
このように、%dと%dの間にスペースを入れる必要があります。
あと、単語の意味から考えて、numberとgoods_codeの使われ方が逆になっていると思うのですが。
ここの処理は何をやっているのかちょっと良くわからないので、意図を教えてください。。
出力したいのは読み込んだデータなので、
while((c=fgetc(fp1))!=EOF){
fputc(c,fp2);
}
これでは、意図した出力になりません。(ちなみに、先の読み込みでファイルポインタが進んでファイルの終点にあるので、そのwhileの中は一回も実行されません。)
[hr][修正]
あいだのスペースは省略可能でした。
if( (fp1=fopen("zaiko.txt","r"))==NULL) {
printf("入力ファイルがオープンできません¥n");
exit(EXIT_FAILURE);
}
if( (fp1=fopen("nyuko.txt","r"))==NULL) {
printf("入力ファイルがオープンできません¥n");
exit(EXIT_FAILURE);
}
while(fscanf(fp1,"%d%d",&data1[kosu1].number,&data1[kosu1].goods_code)==2){
kosu1++;
}
while(fscanf(fp1,"%d%d",&data2[kosu2].number,&data2[kosu2].goods_code)==2){
for(i=0;i<=kosu1;i++){
if(data2[kosu2].number==data1[i].number){
data2[kosu2].goods_code=data1[i].goods_code+data2[kosu2].goods_code;
data2[kosu2].number=data1[i].number;
}
}
kosu2++;
}
fscanf(fp, "%d %d", ...);
このように、%dと%dの間にスペースを入れる必要があります。
あと、単語の意味から考えて、numberとgoods_codeの使われ方が逆になっていると思うのですが。
for(j=0;j<=kosu1;j++){
data3[kosu3].number=data2[j].number;
data3[kosu3].number=data1[j].number;
data3[kosu3].goods_code=data2[j].goods_code;
data3[kosu3].goods_code=data2[j].goods_code;
kosu3++;
}
if( (fp2=fopen("new_zaiko.txt","w"))==NULL){
printf("入力ファイルがオープンできません¥n");
exit(EXIT_FAILURE);
}
while((c=fgetc(fp1))!=EOF){
fputc(c,fp2);
}
while((c=fgetc(fp1))!=EOF){
fputc(c,fp2);
}
これでは、意図した出力になりません。(ちなみに、先の読み込みでファイルポインタが進んでファイルの終点にあるので、そのwhileの中は一回も実行されません。)
[hr][修正]
あいだのスペースは省略可能でした。