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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

3回答

3356閲覧

ループ、paiza.ioでruntime errorの原因(構造体、ファイル)

741s

総合スコア5

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2020/07/09 03:38

実現したいこと

・個人データ(名前、学籍番号、3教科の得点)を構造体で表す。
・ファイルからデータを読み込み、表示する。
・その後、平均点の計算をし、名前・学籍番号・得点のソートを選択する。昇順・降順も選択する。

これらを実行したいのですがmain関数内の最初のdo文しか出力されずまたコンパイルエラーメッセージではなくruntime errorになりエラーの原因が自分では見つけることができませんでした。

どなたかご教示よろしくお願いいたします。

発生しているエラー

paiza.ioでruntime error(Exit status:153(File size limit exceeded))と表示され
実行結果が

ファイル読み込み:1 終了:0  :ファイルをオープンできません。
ファイル読み込み:1 終了:0  :ファイルをオープンできません。
ファイル読み込み:1 終了:0  :ファイルをオープンできません。
ファイル読み込み:1 終了:0  :ファイルをオープンできません。

が永遠と続いています。

画像は読み込みたいファイルです。エディタエリアMain.Cに該当ソースコードを入力しています。
画像は読み込みたいファイルです。エディタエリアMain.Cに該当ソースコードを入力しています。

ソースコード

/*成績管理システム*/ #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 out_file(Student a[]) { FILE *fp; int i=0; if((fp = fopen("hw.dat","r"))==NULL) printf("\aファイルをオープンできません。\n"); else{ while(fscanf(fp,"%s %s %lf %lf %lf",a[i].name,a[i].number,&a[i].math,&a[i].eng,&a[i].phy)){ printf("%-10s %-10s %5.1f %5.1f %5.1f\n",a[i].name,a[i].number,a[i].math,a[i].eng,a[i].phy); i++; } fclose(fp); } return i; } int main(void) { int a,b,c,d; int flag=0; int i=0; int cnt=0; double mave,eave,pave; Student human[40]; do{ printf("ファイル読み込み:1 終了:0  :"); scanf("%d",&flag); if(flag==1) out_file(human); }while(flag!=0); 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関数内で使用しているソート(sort_by_name1)などの関数は/学生を表す構造体/と/ファイル読み込み/の間に作成しており、途中の作成段階ではエラーになりませんでした。

使用PC Windows10   作成ソフト paiza.io

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

"ファイルをオープンできません。"との表示が出るのは、out_file関数の中の

fopen("hw.dat","r")

が失敗している(ファイルを開けなかった)からです。

質問に入っているスクリーンショットを見ると、編集しているファイルは"Main.c"と"hw"の2つのようで、上記のfopen関数の引数として使われている"hw.dat"は見当たりません。

"hw.dat"というファイルが存在しているかどうかを確認してください。

"hw"をコピーして、"hw.dat"にrenameしたら、問題が解決しそうな気がします。

投稿2020/07/09 04:16

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

741s

2020/07/09 04:27

ご回答ありがとうございます。renameしたところ先ほどのエラーは消えました。 また新たなエラーが出たので他にもプログラム自体に問題がありそうです。が、投稿内容のエラーはおそらく解決しました。ありがとうございました。
guest

0

ベストアンサー

C

1#include <errno.h> //追加 2 : 3 : 4//printf("\aファイルをオープンできません。\n"); コメント化 5printf("\aファイルをオープンできません。(errno=%d)\n", errno); //追加

で実行したとき、errnoの値に何が表示されますか?

投稿2020/07/09 04:05

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

741s

2020/07/09 04:08

ファイル読み込み:1 終了:0  :ファイルをオープンできません。(errno=2) ファイル読み込み:1 終了:0  :ファイルをオープンできません。(errno=2) こちらがループしました。
DreamTheater

2020/07/09 04:13

errno = 2はNo such file or directory。 ファイルかディレクトリが存在しないということです。 hw.datというファイルをオープンしようとしていますが、このファイルは実行パスと同じディレクトリにあるのですか? hw.datが存在するディレクトリパス付きで指定してもエラーとなりますか?
741s

2020/07/09 04:24

ありがとうございます。そうなんですね。エディタエリア名をhwからhw.datに変更して実行してみたところ 先ほどのエラーは消え Runtime error(Exit status:139(Invalid memory reference))になりました。 これはそもそもどこかの定義に問題があるのでしょうか?
DreamTheater

2020/07/09 04:41

お使いのエディタに関する知識がないので、何が問題なのかわかりません。 拡張子なしのファイルは、(エディタが)勝手に拡張子 .dat を付与するんですか? 質問者さんが.datを付けた理由が知りたいです。
741s

2020/07/09 04:48

datについて意味はありません。昨年の大学の講義では学内のパソコンでファイルには書き込みをするプログラムを作成していたのでその時のものを参考にしてしまいdatを付けてしまいました。 投稿したときのエラーはファイル名が一致していなかったためだと考えたのでのでこちらに統一しました。
DreamTheater

2020/07/09 04:56

拡張子ありと拡張子なしは別ファイルです。 意味がないではなく重要なことです。 言語学習と同じくらい大切です。 UNIX(Linux)の世界ではアルファベットの大文字小文字すら区別されます。
741s

2020/07/09 05:17

そうなんですね。勉強になります。 読み込むファイル名を「File1」にして作成してみます。
guest

0

そのエラーの言う通り、ファイルが見つからないってことなんでは

投稿2020/07/09 03:42

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

741s

2020/07/09 04:16

paiza.ioでは新しいエディタエリアがファイル扱いになると考えていましたがそうではないのでしょうか?もしpaiza.ioでのファイル作成についてご存じでしたらご教示ください。 また自分で runtime error(Exit status 153 で検索したところ「添字が指定範囲外になっている」と出てきました。
y_waiwai

2020/07/09 04:22

そこら辺の事情はよーわかりませんが、エラーメッセージはそう言ってますよね。 まずはそのファイルが存在するのかをチェックするコードを書いてみては?
741s

2020/07/09 04:30

最初のご指摘通りファイルの存在に問題があったようです。 投稿内容のエラーについて解決できました、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問