実現したいこと
while文を用いて指定された文字数(12文字)が入力されるまで読み込みを続けること。
前提
C言語で以下のような課題のプログラムを作っています。
バイナリファイルには,先頭から,生徒0のデータ→生徒」のデータ → 生徒2のデータ→・・・のように複数の生徒(30人以内)のデータが格納されており,各生徒のデータは次のような構成になっている。
姓(char型12個分)
科目1の点数(int型1個分)
科目2の点数(int型1個分)科目3の点数(int型1個分)
文字型2次元配列name(要素数30x12),整数型2次元配列sub(要素数30
x3),double型配列 ave(要素数3)を宣言する、そして,このファイルから,i番目の生徒の姓,科目1の点数,科目2の点数,科目3の点数をname[i],sub[i][0], sub[i][1], sub[i][2]に格納する。その後,生徒の絵数,科目1,科目2,科目3の平均点を求めて ave[0], ave[1], ave[2]に格納し,画面出力(表示)するプログラムを作成せよ。
※データ個数が与えられていないのでfor文ではなくwhile文を用いる..
※ fopen ではファイル名は“./../bin-score.dat"と設定する。
そして、自分なりにプログラムを作りました。
while文のところでおそらく間違っているのですが、「nameに対して文字が12個分読めている間繰り返す」という指示と、「ファイルの内容の読み出しデータの個数の情報は与えられていないので、ファイルの末尾まで読み出しを繰り返す」という指示があります。
発生している問題・エラーメッセージ
Kawai 84 62 74 Abe 62 58 68 Kubota 88 95 54 Yamada 77 39 100 Suzuki 82 55 66 Ogawa 48 100 61 Asai 88 92 96 Yoshida 94 92 96 Number of students : 8 Average : 77.875000 74.125000 76.875000 C:\Lecture\Prog2\Prog2_3_hw5\x64\Debug\Prog2_3_hw5.exe (プロセス 2364) は、コード 0 で終了しました。 このウィンドウを閉じるには、任意のキーを押してください... という風に正しいように表示されるのですが、正答例を見てみると"Kawai"の上に"Kimura"というデータがあるそうなんです。
該当のソースコード
C
1#include <stdio.h> 2 3int main(void) 4{ 5 FILE* fp; 6 char name[30][12]; 7 int sub[30][3]; 8 double ave[3] = { 0.0,0.0,0.0 }; 9 int i; 10 fp = fopen("../../bin-score.dat", "rb"); 11 if (fp == NULL) 12 { 13 printf("File open error.\n"); 14 return 1; 15 } 16 i = 0; 17 while (fread(&name[i], sizeof(char), 12, fp) == 12) 18 { 19 fread(&sub[i], sizeof(int), 3, fp); 20 fread(name[i], sizeof(char), 12, fp); 21 fread(&sub[i], sizeof(int), 3, fp); 22 ave[0] += sub[i][0]; 23 ave[1] += sub[i][1]; 24 ave[2] += sub[i][2]; 25 printf("%s %d %d %d\n", name[i], sub[i][0], sub[i][1], sub[i][2]); 26 i++; 27 } 28 ave[0] /= (float)i; 29 ave[1] /= (float)i; 30 ave[2] /= (float)i; 31 printf("Number of students : %d\n", i); 32 printf("Average : %lf %lf %lf\n", ave[0], ave[1], ave[2]); 33 fclose(fp); 34 return 0; 35}
試したこと
while文の中にfgetsを入れてみたりsizeof(Int)にしたりしましたが、ファイルがうまく出力されませんでした。
また、teratailでの皆様の回答を参考にさせていただき、whileの{}中のfreadの文を増やしてname→subのデータでループできるようにしたところ8個の正確なデータと平均点もデータが出たのですが、正答例を見ると"Kawai"のデータの上に"Kimura"というデータがあるらしく、やはりwhile文の中が間違えていると思うのです。
回答2件
あなたの回答
tips
プレビュー