前提・実現したいこと
授業のプログラミングの課題でファイル操作をするところがあるのですが、なぜ正常に動かないのかがよくわかりません。
課題の内容は、バブルソートを用いて成績管理システムを作るといったものです。バブルソートに関してはある程度理解できたかと思うのですが、ファイル操作に関しては授業のメインでないこともありあまり説明がなく、調べてみてもよくわからなかったので、どう使えばいいのか十分に理解できていない現状です。
ファイルを読み込んで、その内容を構造体に格納したいのですが、実行すると名前がNULLで、それぞれの点数も0点と表示されてしまっているのですが、原因がわからず困っています。ご教授頂けますと幸いです。
該当のソースコード
C言語
1#include <stdio.h> 2#include <stdlib.h> 3 4#define seisekiMAX 256 5 6typedef struct{ 7 char name[seisekiMAX]; // 氏名 8 int kokugo; // 国語の評点 9 int sansu; // 算数の評点 10 int rika; // 理科の評点 11}Seiseki; 12 13 14int seisekiCount = 0; // ファイルの行数(=データの数) 15 16 17void putSeisekiArray(Seiseki*); // ファイルからデータを読み込み配列へ格納する 18void view(Seiseki*); // 構造体配列に格納されている各データを表示する 19void sort(Seiseki*); // 国語を基準に降順でバブルソート 20 21 22int main(){ 23 24 // 構造体配列の宣言 25 // seisekiMAXはメイン関数の外で#define で256に設定 26 // Seiseki 型もメイン関数の外で定義しているものとする 27 Seiseki seiseki[seisekiMAX]; 28 29 // putSeisekiArray の中でファイルからデータを読み込む 30 putSeisekiArray(seiseki); 31 32 // ソート前のデータを表示 33 printf("**** origin ****\n"); 34 view(seiseki); 35 36 printf("\n"); 37 38 // バブルソートを行う 39 sort(seiseki); 40 41 // ソート後のデータを表示 42 printf("**** sorted ****\n"); 43 view(seiseki); 44 45 return 0; 46} 47 48// ファイルからデータを読み込み配列へ格納する 49void putSeisekiArray(Seiseki* seiseki){ 50 FILE *fp; // FILE型構造体 51 char buf[256]; // ファイルの一行分を格納 52 53 54 // ファイルを開く。失敗するとNULLを返す 55 fp = fopen("data.txt", "r"); 56 if(fp == NULL){ 57 // ファイルオープンに失敗した場合の処理(異常終了) 58 printf("ファイルのオープンに失敗しました\n"); 59 exit(1); 60 } 61 62 // ファイルの内容を全行読み込む 63 while (fgets(buf, sizeof(buf), fp) != NULL){ 64 // 読み込んだデータを格納 65 sscanf( buf, "%s %d %d %d", (seiseki+seisekiCount)->name, &(seiseki+seisekiCount)->kokugo, &(seiseki+seisekiCount)->sansu, &(seiseki+seisekiCount)->rika ); 66 seisekiCount++; 67 } 68 69 // ファイルをクローズする 70 fclose(fp); 71} 72 73// 構造体配列に格納されている各データを表示する 74void view(Seiseki *seiseki){ 75 for(int i = 0; i < seisekiCount; i++){ 76 printf( "%s\n 国語:%d点 算数:%d点 理科:%d点\n", (seiseki+seisekiCount)->name,(seiseki+seisekiCount)->kokugo, (seiseki+seisekiCount)->sansu, (seiseki+seisekiCount)->rika ); 77 } 78} 79 80// 国語を基準に降順でバブルソート 81void sort(Seiseki *seiseki){ 82 Seiseki tmp; 83 84 for(int i = 0; i < seisekiCount-2; i++){ 85 for(int j = 0; j < seisekiCount-2-i; j++){ 86 if((seiseki+j)->kokugo > (seiseki+j+1)->kokugo){ 87 tmp = *(seiseki + j); 88 *(seiseki + j) = *(seiseki + j + 1); 89 *(seiseki + j + 1) = tmp; 90 } 91 } 92 } 93}
data.txt(読み込みたいファイル)
Ichiro 92 95 98 Jiro 70 75 80 Saburo 75 75 75 Shiro 95 90 85 Goro 83 80 77 Rokuro 85 75 65 Shichiro 50 70 90 Hachiro 60 40 20
回答1件
あなたの回答
tips
プレビュー