質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.92%

ファイルを作る、開く方法(構造体、成績管理システム)

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 177

741s

score 5

実現したいこと

成績管理システムを作成しています。
名前、学籍番号、3教科の得点からなる構造体を用いてファイルを読み込み、ファイル内データを表示したり平均点を求めるものです。

ファイルの内容を成績管理システムと同じプログラム内に作ることは可能でしょうか?
ファイルオープンし、その後の処理を実行したいです。
ソートなどの関数は作ってあり、エラーは出ていません。

(初歩的な質問で申し訳ありません。コロナの影響で大学がリモートになり昨年と使っているソフトが違い、よくわからなくなってしまいました。)

ソースコード

/*成績管理システム*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#define NAME_LEN 128
#define NUM_LEN 64
#define NUMBER 5

/*学生を表す構造体*/
typedef struct{
    char name[NAME_LEN]; //名前
    char number[NUM_LEN]; //学籍番号
    double math; //数学の得点
    double eng; //英語の得点
    double phy; //物理の得点
}Student;

int main(void)
{

    int a,b,c,d;
    int i=0;
    int cnt=0;
    double mave,eave,pave;
    //構造体作成
    Student human[NUMBER]={
        {"Shimizu","h741", 50.0,60.0, 70.0},
        {"Mayu","h777", 60.0, 70.0, 80.0},
        {"Momo","h500", 80.0, 80.0, 80.0},
    };


    /*ファイル読み込み*/
    FILE *fp;
    //int i=0;

    if((fp = fopen("hw.dat","r"))==NULL){
    printf("\aファイルをオープンできません。\n");
    }
    else{
        while(fscanf(fp,"%s %s %lf %lf %lf",human[i].name,human[i].number,&human[i].math,&human[i].eng,&human[i].phy)){
        printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
        i++;
    }
    fclose(fp);
    }
   return i;


    printf("平均点を表示しますか? はい:1 いいえ:2  :");
    scanf("%d",&a);

    if(a==1){
        sum_Student(human,cnt,&mave,&eave,&pave);
        printf("数学の平均点は%3.1lfです。",mave);
        printf("英語の平均点は%3.1lfです。",eave);
        printf("物理の平均点は%3.1lfです。",pave);
    }

    do{
        printf("各順にソートしますか? はい:1 いいえ:2  :");
        scanf("%d",&b);
        if(a==1){
            printf("どのデータによってソートしますか? 名前:1 学籍番号:2 数学:3 英語:4 物理:5  :");
            scanf("%d",&c);
            printf("昇順と降順どちらでソートしますか? 昇順:1 降順:2  :");
            scanf("%d",&d);


            if(c==1&d==1){
                puts("\n名前を昇順にソートしました。");
                sort_by_name1(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
            if(c==1&d==2){
                puts("\n名前を降順にソートしました。");
                sort_by_name2(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
            if(c==2&d==1){
                puts("\n学籍番号を昇順にソートしました。");
                sort_by_number1(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
            if(c==2&d==2){
                puts("\n学籍番号を降順にソートしました。");
                sort_by_number2(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
            if(c==3&d==1){
                puts("\n数学の得点を昇順にソートしました。");
                sort_by_math1(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
            if(c==3&d==2){
                puts("\n数学の得点を降順にソートしました。");
                sort_by_math2(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
            if(c==4&d==1){
                puts("\n英語の得点を昇順にソートしました。");
                sort_by_eng1(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
            if(c==4&d==2){
                puts("\n英語の得点を降順にソートしました。");
                sort_by_eng2(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
            if(c==5&d==1){
                puts("\n物理の得点を昇順にソートしました。");
                sort_by_phy1(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
            if(c==5&d==2){
                puts("\n物理の得点を降順にソートしました。");
                sort_by_phy2(human,cnt);
                for(i=0;i<cnt;i++)
                printf("%-10s %-10s %5.1f %5.1f %5.1f\n",human[i].name,human[i].number,human[i].math,human[i].eng,human[i].phy);
            }
        }


    }while(b!=2);
    return 0;
}


実行結果
ファイルをオープンできません。

試したこと

main関数内で構造体の内容を作成してみましたがやはり反映されませんでした.

補足

使用PCはWindows10でプログラム作成に使用しているソフトはpaiza.ioという無料サイトです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • cateye

    2020/07/09 06:03

    paiza.ioって、ファイルの書き込み出来ましたっけ?

    キャンセル

  • 741s

    2020/07/09 11:53

    同じプログラム(エディタエリア)内ではできないみたいです。
    気づかせていただきありがとうございます。

    キャンセル

回答 2

checkベストアンサー

+1

存在しないファイルを読み込もうとしたら開けなかった、ということですよね?
とりあえず自分で該当するデータが入っているファイルを作って paiza.io にアップロードしたら少し前進するんじゃないかと思います。

https://paiza.io/help?locale=ja-jp に「エディターエリアにファイルをドラッグアンドドロップするとファイルのアップロードが可能です。」と書いてあります。それ以降にも複数ファイルのアップロードの仕方などが書いてあります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/09 11:53

    ご回答ありがとうございます。

    paiza.ioでは新しいエディタエリアを開きそこにデータ入力するのですね。
    リンクありがとうございます。paiza.ioについて勉強になりました。これからも授業でファイル作成があると思うので助かりました。

    キャンセル

+1

ファイルの内容を成績管理システムと同じプログラム内に作ることは可能でしょうか?

どのようなことをしたいのかわかりません。
もっと具体的な処理内容を書くことは出来ますか?

ファイルオープンし、その後の処理を実行したいです。

実行結果
ファイルをオープンできません。 

    if((fp = fopen("hw.dat","r"))==NULL){
        printf("\aファイルをオープンできません。\n");
    }


「ファイルをオープンできません」とは上記部分でfopenによるファイルオープンが出来ず、printf()のエラーメッセージが表示されてしまうということですか?

また、main()の途中で「return i;」が入っていてそれ以降進まなくなっていますが、作業の過程で一時的に入っているものですか?

※以下、コメントを受けて追記

同じプログラム内で
Shimizu h741 50.0 60.0 70.0
(名前 学籍 点数)
等のデータが入ったファイルを作りたいです。

ファイルを書き込みモードでオープンし、

fp = fopen( "hw.dat", "w+" );

そのファイルに構造体配列の内容を書き込めば良いです。当然読み込む際と書き込む際の書式は合わせる必要があります。

fprintf( fp, "Shimizu h741 50.0 60.0 70.0\n" ); /* 実際には構造体の内容を書き込む */

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/09 04:11

    読んでいただきありがとうございます。わかりずらく申し訳ありません。

    同じプログラム内で
    Shimizu h741 50.0 60.0 70.0
    (名前 学籍 点数)
    等のデータが入ったファイルを作りたいです。

    ファイル自体が存在しないので「ファイルオープンされません。」は合っていると思います。

    「return i;」は消し忘れです。不備が多くて申し訳ないです。

    キャンセル

  • 2020/07/09 04:22

    回答に追記しました。

    キャンセル

  • 2020/07/09 11:50

    追記ありがとうございます。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.92%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る