ページ 1 / 1
構造体配列の動的確保
Posted: 2019年6月26日(水) 18:54
by rika0522
[1] 構造体配列(10領域)を動的確保した後、既に存在しているファイルからデータを読み込み、ターミナル上に出力したいです。(C言語)
[2] 下記のようにソースコードを実行してみたところ、Segmentation fault: 11と出ました。おそらくfor分からが間違っていると思われるのですが、for分を使ってファイル入力処理、標準出力処理を行うにはどうしたらいいでしょうか?
コード:
#include <stdio.h>
#include <stdlib.h>
typedef struct person {
int student_id;
char name[20];
char gender;
int point;
}STUDENT;
int main (void){
int i;
STUDENT * st = (STUDENT *) malloc(11 *sizeof(STUDENT));
FILE * fp;
if((fp=fopen("02student.txt","r"))==NULL);
for(i=0; i<10; i++){
if(fscanf(fp,"%d %s %c %d\n"
,st[i].student_id, st[i].name, st[i].gender, st[i].point));
}
for(i=0; i<10; i++){
printf("%d %s %c %d\n"
,st[i].student_id, st[i].name, st[i].gender, st[i].point);
}
fclose(fp);
free(st);
return 0;
}
Re: 構造体配列の動的確保
Posted: 2019年6月26日(水) 21:42
by Math
あれまだだれも答えてあげないの。じゃ仕方ないか..
gcc 8.2.0 使用
プログラム
http://www2.koyoen.birdview.co.jp/~abcx ... -26-a-.PNG
実行結果
http://www2.koyoen.birdview.co.jp/~abcx ... -26-b-.PNG
02student.txt
コード:
11 aaa f 10
22 bbb m 20
33 ccc f 30
44 ddd m 40
55 eee f 50
66 fff f 60
77 ggg f 70
88 hhh m 80
98 iii m 90
99 jjj m 91
Re: 構造体配列の動的確保
Posted: 2019年6月26日(水) 22:13
by Math
質問者様のプログラムには 全角スペースが紛れ込んでいるためエラーになったが
それ以外はワーニングはでたけれどエラーにはならずexeはできました。
何も出力はしなかったけど(^^;
Re: 構造体配列の動的確保
Posted: 2019年6月27日(木) 02:22
by box
コード:
if((fp=fopen("02student.txt","r"))==NULL);
この文の最後にある謎のセミコロンはどういう意味を持つのでしょうか。
Re: 構造体配列の動的確保
Posted: 2019年6月27日(木) 06:17
by Math
私の答えが読めねえのか。
間違えたにきまってるだろう(^^;
NULL だったら ファイル が読めなかったときの処理を書くべきだわね!
普通VisualStudio Codeにかいてあるようにするだろう。
Re: 構造体配列の動的確保
Posted: 2019年6月27日(木) 06:27
by Math
過去ログに何度も答えているのに参考にしてくださいね。
(過去ログの検索法 わかるよね? 返信ボタンの右にあるよ。)
Re: 構造体配列の動的確保
Posted: 2019年6月27日(木) 06:59
by Math
私のVisualStudio Code でわかるとおもうけど
① ファイルの読み込みの時のエラー処理がぬけてる。
② fscanf の使い方がデタラメ。かなりひどいので 参考書をよく確認する必要があります。
③ malloc は 配列10個 でいいはず。 11個はメモリーの無駄
あとはいいと思いまっせ。
Re: 構造体配列の動的確保
Posted: 2019年6月27日(木) 07:11
by Math
fscanf は
https://bituse.info/c_func/42
ここに説明されてるように
変数のポインタを並べて指定します。つまり 変数の前に & をつけます。
(第1引数にはファイルポインタを指定します。)
Re: 構造体配列の動的確保
Posted: 2019年6月27日(木) 07:34
by Math
正し name は配列なので すでに ポインターです
この辺の事情は
viewtopic.php?f=3&t=20659
をご覧ください。
Re: 構造体配列の動的確保
Posted: 2019年6月28日(金) 02:19
by box
Segmentation fault: 11と出ました。
あらら。他の回答者からの回答(そのままコンパイルしたら全角空白のためにエラーが出た)と
食い違ってますね。
実行してsegmentation errorが出た、というそのコードを、コピペして見せてください。
Re: 構造体配列の動的確保
Posted: 2019年6月28日(金) 07:43
by みけCAT
box さんが書きました: ↑4年前
Segmentation fault: 11と出ました。
あらら。他の回答者からの回答(そのままコンパイルしたら全角空白のためにエラーが出た)と
食い違ってますね。
全角空白があってもそのまま実行できる処理系もあるので、食い違っているとは限りません。
https://wandbox.org/permlink/h55LBXsvMrPFijHU
Re: 構造体配列の動的確保
Posted: 2019年6月28日(金) 19:09
by rika0522
ありがとうございます。参考にさせていただきます。C言語もこのサイトも不慣れな部分が多いので勉強して行きたいと思います。
Re: 構造体配列の動的確保
Posted: 2019年6月29日(土) 18:51
by box
Re: 構造体配列の動的確保
Posted: 2019年6月29日(土) 18:59
by Math
処理系にももちろん依存するし
質問者の環境にもよるね
送ってきたものがコピペとはおもえないね(^^;
エラーからみてメモリー関係だろう … ね!
Re: 構造体配列の動的確保
Posted: 2019年6月29日(土) 19:25
by Math
>バグのないプログラムはない。
>プログラムは思ったとおりには動かない。書いたとおりに動く。
だよねー
だから送ってきたプログラムと質問者様のテストしたのとは 違う(^^;
全角スペース自体コピペではあんまり起きえないもの。
Re: 構造体配列の動的確保
Posted: 2019年6月29日(土) 19:32
by Math
私のもコピペできるようにVisualStudio Code から載せておきますね。(^^;
コード:
#include <stdio.h>
#include <stdlib.h>
typedef struct person {
int student_id;
char name[20];
char gender;
int point;
}STUDENT;
int main (void){
int i;
STUDENT * st = (STUDENT *) malloc(10 * sizeof(STUDENT));
FILE * fp;
if((fp=fopen("02student.txt","r"))==NULL){
printf( "file cannnot open\n" ); return -1; }
for(i=0; i<10; i++){
fscanf(fp,"%d %s %c %d"
,&st[i].student_id, st[i].name, &st[i].gender, &st[i].point);
}
for(i=0; i<10; i++){
printf("%d %s %c %d\n"
,st[i].student_id, st[i].name, st[i].gender, st[i].point);
}
fclose(fp);
free(st);
return 0;
}