4 Lesson 8-3 データをまとめて管理する2

4.1 問題

Lesson 8-3
Lesson 8-2で作成したテキストファイルを読み込み、曲名を入力するとその曲が入って いるCDの名前と何番目かを表示してくれるプログラムを作成しなさい。

4.2 プログラム例

この問題のプログラム例 (findCD.c) をリスト3に示す。

リスト3:曲名検索

001: #include <stdio.h>
002: #include <string.h>
003: 
004: /*---- 構造体 ----*/
005: struct cd_data{
006:   char title[64];           /* タイトルを入れる配列 */
007:   char artist[64];          /* アーティストを入れる配列 */
008:   char song[6][64];         /* 曲名を入れる配列(6曲分) */
009: };
010: 
011: /*---- プロトタイプ宣言 ----*/
012: int read_file(struct cd_data CD[]);
013: int read_title(int cdnum, FILE *rfile, struct cd_data CD[]);
014: int read_artist(int cdnum, FILE *rfile, struct cd_data CD[]);
015: int read_song(int cdnum, FILE *rfile, struct cd_data CD[]);
016: int find_song(char song[], struct cd_data CD[]);
017: 
018: /*==================================================================*/
019: /*           メイン関数                                              */
020: /*==================================================================*/
021: int main(void){
022:   char song[64];                 /* 検索する曲名を入れる配列 */
023:   int nc, find;
024:   struct cd_data CD[10];         /* CDのデータを入れる構造体 */
025: 
026:   /*----- 検索する曲名の入力 ---------*/
027: 
028:   printf("探したい曲名?\t");
029:   fgets(song, 64, stdin);        /* キーボードから曲名入力 */
030:   nc=strlen(song);               /* 曲名の文字数+1(\n) */
031:   song[nc-1]='\0';               /* 改行(\n)を文字終了(\0)に変更 */
032:   printf("\n");                  /* 改行 */
033: 
034: 
035:   /*----- ファイルの読み込みと検索 ---------*/
036:   read_file(CD);                   /* CDのデータの読み込み */
037:   find = find_song(song,CD);       /* 曲名の検索 */
038: 
039:   /*----- 見つからなかった場合のメッセージ ---------*/
040:   if(find==0){
041:     printf("お探しの曲はありません。\n");
042:   }
043: 
044:   return 0;
045: }
046: 
047: /*==================================================================*/
048: /*           データのfileの読み込み                                    */
049: /*==================================================================*/
050: int read_file(struct cd_data CD[]){
051:   FILE *rfile;
052:   int i;
053: 
054:   rfile = fopen("CDdata.txt","r");   /* CDのデータファイルのオープン */
055: 
056:   for(i=0; i<10; i++){
057:     read_title(i, rfile, CD);     /* タイトル名を読み込む関数のコール */
058:     read_artist(i, rfile, CD);    /* アーティスト名を読み込む関数のコール */
059:     read_song(i, rfile, CD);      /* 曲名を読み込む関数のコール */
060:   }
061:   
062:   fclose(rfile);                  /* ファイルのクローズ */
063: 
064:   return 0;
065: 
066: }
067: 
068: /*==================================================================*/
069: /*           タイトル名の読み込み                                      */
070: /*==================================================================*/
071: int read_title(int cdnum, FILE *rfile, struct cd_data CD[]){
072:   int nc, nc1, nc2;
073:   char temp, c1[64], c2[64];
074: 
075:   sprintf(c1,"CD%d",cdnum+1);     /* CD番号 CD1, CD2, CD3 ...をc1へ */
076:   nc1=strlen(c1);                 /* CD番号の文字数 */
077: 
078:   do{                             /* CD番号の検索 */
079:     fscanf(rfile, "%s",c2); 
080:     nc2=strlen(c2);
081:     if(nc1<nc2){
082:       nc=nc2;
083:     }else{
084:       nc=nc1;
085:     }
086:   }while(strncmp(c1,c2,nc)!=0);
087:   
088:   temp=fgetc(rfile);              /* 空白の読み飛ばし */
089:   
090:   sprintf(c1,"Title"); 
091:   nc=strlen(c1);
092:   
093:   do{                             /* Title: の検索 */
094:     fscanf(rfile, "%s",c2);
095:   }while(strncmp(c1,c2,nc)!=0);
096:   
097:   temp=fgetc(rfile);               /* 空白の読み飛ばし */
098:   
099:   fgets(CD[cdnum].title,64,rfile); /* タイトルの読み込み */
100: 
101:   nc=strlen(CD[cdnum].title);
102:   CD[cdnum].title[nc-1]='\0';     /* 改行(\n)を文字終了(\0)に変更 */
103:   
104:   return 0;
105: 
106: }
107: 
108: /*==================================================================*/
109: /*           アーティスト名の読み込み                                   */
110: /*==================================================================*/
111: int read_artist(int cdnum, FILE *rfile, struct cd_data CD[]){
112:   int nc, nc1, nc2;
113:   char temp, c1[64], c2[64];
114: 
115:   sprintf(c1,"Artist:");          /* "Artist:"をc1へ格納 */
116:   nc1=strlen(c1);
117: 
118:   do{                             /* "Artist:"の検索 */
119:     fscanf(rfile, "%s",c2);
120:     nc2=strlen(c2);
121:     if(nc1<nc2){
122:       nc=nc2;
123:     }else{
124:       nc=nc1;
125:     }
126:   }while(strncmp(c1,c2,nc)!=0);
127:   
128:   temp=fgetc(rfile);                 /* 空白の読み飛ばし */
129:   
130:   fgets(CD[cdnum].artist,64,rfile);  /* 空白付きアーティストの読み込み */
131: 
132:   nc=strlen(CD[cdnum].artist);
133:   CD[cdnum].artist[nc-1]='\0';     /* 改行(\n)を文字終了(\0)に変更 */
134:   
135:   return 0;
136: 
137: }
138: 
139: /*==================================================================*/
140: /*           曲名の読み込み                                           */
141: /*==================================================================*/
142: int read_song(int cdnum, FILE *rfile, struct cd_data CD[]){
143:   int i, nc, nc1, nc2;
144:   char temp, c1[64], c2[64];
145: 
146:   for(i=0; i<6; i++){              /* 6曲分ファイルから読み込む */
147:     sprintf(c1,"song%d:", i+1);    /* "song?:"をc1へ格納 */
148:     nc1=strlen(c1);
149:     
150:     do{                            /* "song?:"の検索 */
151:       fscanf(rfile, "%s",c2);
152:       nc2=strlen(c2);
153:       if(nc1<nc2){
154:     nc=nc2;
155:       }else{
156:     nc=nc1;
157:       }
158:     }while(strncmp(c1,c2,nc)!=0);
159:     
160:     temp=fgetc(rfile);    /* 空白の読み飛ばし */
161:     
162:     fgets(CD[cdnum].song[i],64,rfile);  /* 曲名の読み込み */
163:     
164:     nc=strlen(CD[cdnum].song[i]);
165:     CD[cdnum].song[i][nc-1]='\0';     /* 改行(\n)を文字終了(\0)に変更 */
166: 
167:   }
168: 
169:   return 0;
170: 
171: }
172: 
173: /*==================================================================*/
174: /*           曲名検索                                                */
175: /*==================================================================*/
176: int find_song(char song[], struct cd_data CD[]){
177:   int i,j;
178:   int nc, nc1, nc2, fnd;
179: 
180:   fnd=0;
181: 
182:   nc1=strlen(song);
183: 
184:   for(i=0; i<10; i++){             /* CD番号のループ */
185:     for(j=0; j<6; j++){            /* 曲番号のループ */
186:       
187:       nc2=strlen(CD[i].song[j]);   /* 曲名の文字数 */
188:       if(nc1<nc2){                 /* 文字数の多い方で比較 */
189:     nc=nc2;
190:       }else{
191:     nc=nc1;
192:       }
193: 
194: 
195:       /* ---- 曲名が一致したら画面へ出力 ---- */
196: 
197:       if(strncmp(song, CD[i].song[j], nc)==0){
198:     if(fnd==0){
199:       printf("%sが見つかりました。タイトルと曲番は以下の通り。\n", song);
200:       fnd=1;
201:     }
202:     printf("\t%s    %d\n", CD[i].title, j+1);
203:       }
204: 
205:     }
206:   }
207: 
208:   return fnd;     /* 0; 見つからない場合  1:見つかった場合 */
209: 
210: }
211: 
212: 
\fbox{実行結果}

	探したい曲名?   song1

	song1が見つかりました。タイトルと曲番は以下の通り。
	        title5    1
	        title6    1



ホームページ: Yamamoto's laboratory
著者: 山本昌志
Yamamoto Masashi
平成17年6月6日


no counter