この課題が分かりません。
「テキストファイルscore.txtには、以下のように、ゲームの得点と、プレイヤーの名前の一覧が記述されている。このファイルを読み込み、プレイヤー名とスコアを表示し、中で最高得点を取得したプレイヤーの名前と点数を表示しなさい。
<score.txtの内容> James,1000 Tom,1200 Steve,2800 Bob,900
<実行結果> プレイヤー 得点 -------------------- James 1000点 Tom 1200点 Steve 2800点 Bob 900点 -------------------- 最高得点:Steve(2800点) ``` 」(問題文ここまで) 以下のようなコードを書いてみました。 ```#include<stdio.h> #include<stdlib.h> #include<string.h> #pragma warning(disable:4996) #define size 2048 void main(){ FILE* file; char line[size]; char str1[size], str2[size], str3[size], str4[size]; int n1, n2, n3, n4; int max; line[0] = '\0'; file = fopen("c:\\test\\score.txt","r"); if (file == NULL){ printf("ファイルが開けません\n"); exit(1); } printf("プレイヤー得点\n--------------\n"); while (fgets(line, size, file) != NULL){ sscanf(line,"%[^,],%d,%[^\r\n,],%d,%[^\r\n,],%d,%[^\r\n,],%d",str1,&n1,str2,&n2,str3,&n3,str4,&n4); printf("%s %d点\n%s %d点\n%s %d点\n%s %d点\n", str1, n1, str2, n2, str3, n3, str4, n4); } max = n1; if (n2 > max){ max = n2; } if (n3 > max){ max = n3; } if (n4 > max){ max = n4; } printf("--------------\n最高得点:"); if (n1 == max){ printf("%s(%d点)", str1, n1); } if (n2 == max){ printf("%s(%d点)", str2, n2); } if (n3 == max){ printf("%s(%d点)", str3, n3); } if (n4 == max){ printf("%s(%d点)", str4, n4); } fclose(file); getchar(); }
score.txtの内容が「James,1000,Tom,1200,Steve,2800,Bob,900」ならば望み通りの実行結果が得られましたが、問題文の通りのscore.txtの内容だと上手く行きません。
fgets()は文字列読み込みの際に\nがあればそこで読み込みを止めるというのは知っているのですが、sscanf()でコンマを飛ばしつつ改行飛び越して4行の文字列と数字を読み込む方法が分かりません。fgetどうか教えて下されば幸いです。
<追伸>
fgets()がファイルの最後にNULLが出てくるまでファイル全て読み込ませる意図でwhile文を書きました。ただfgets()は1行ごとにしか読み込めず、1行目読み込んだ後lineに1行目の文字列が格納されるが、それで2行目読み込んだ後lineに1行目の文字列が消された上で2行目の文字列が格納されるのだと思います(ここら辺の細かい仕組みについてはまだあまり理解できていません)。4行目まで読み込んだ後は4行目の文字列しか格納されてないのでしょう(実行時、最高得点の所は表示されたが「最高得点:Bob (900点)」と表示されていた)。fgets()に改行を読み込ませないか、あるいはfgetc()で読み込むという手がありますが、sscanf()とどう結び付ければよいのかが分かりません。
質問書式の体をなしておらずすいませんでした。確かに読む気を起こさせるようなものでは無かったと思っております。これを機会にマナーを守って質問していきます。
回答1件
あなたの回答
tips
プレビュー