🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

ファイル

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

1回答

5572閲覧

C言語 ファイルデータを構造体に入れる

ishiko

総合スコア6

C

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

ファイル

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

1クリップ

投稿2021/03/02 08:48

編集2021/03/02 08:49

前提・実現したいこと

ファイルデータを構造体に入れたいです。
ファイル内容は以下
Yamada Hanako 50
Suzuki Takuya 40


計50人分の点数データがあります。

発生している問題・エラーメッセージ

実行するとなぜか点数が6418156や6418240など、どこから来たのか不明な数字が出てきます。名前は普通に表示されます。

該当のソースコード

C

1#include <stdlib.h> 2 3 typedef struct 4 { 5 char FamilyName[32]; 6 char FirstName[32]; 7 int Score[5]; 8 } Student; 9 10int main(void) 11{ 12 int i, m; 13 FILE*fp; 14 Student data[50]; // 構造体配列の宣言 15 16 fp=fopen("tensu.txt","r"); 17 if(fp == NULL){ 18 perror("ファイルの読み込みに失敗/n"); 19 } 20 for( i = 0; i <= 50; i++ ) { 21 if( fscanf( fp, "%s%s%d\n" , data[i].FamilyName, data[i].FirstName, data[i].Score ) != 3 ) break; 22 } 23 for(m=0;m<50;m++){ 24 printf("%s %s %2d\n", data[m].FamilyName, data[m].FirstName, data[m].Score ); 25 } 26fclose( fp ); 27} 28

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

int Score[5];

と何故か配列にしているのが原因です。

printf("%s %s %2d\n", data[m].FamilyName, data[m].FirstName, data[m].Score );

data[m].Scoreは整数値じゃなくて変数のアドレスです。
コンパイル時に警告は出ませんでしたか?

投稿2021/03/02 08:56

otn

総合スコア85882

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

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

ishiko

2021/03/02 09:04

警告出ませんでした、、、 アドレスではなく点数を表示させたいときはint Score[5]を消さなくてはいけませんか? typedef struct { char FamilyName[32]; char FirstName[32]; int Score[5]; } Student; ここは固定なので、ここ以外を直したいです。
otn

2021/03/02 09:10

何故配列なのでしょうか? 点数は1つじゃなくて最大5つある?
ishiko

2021/03/02 09:16

点数は1つだと思います。
otn

2021/03/02 09:20

> 点数は1つだと思います。 ならば、点数は、Score[0]、Score[1]、Score[2]、Score[3]、Score[4]のうち、どこに入れるのでしょう?全部??
ishiko

2021/03/02 09:24

5種類の点数を扱うとき、int Score[5]としますか? 質問を質問で返してしまってすみません。
otn

2021/03/02 09:29

点数が1つなら、普通は int Score; (int Score[1]; でも間違いではないが)、 点数が5つなら、int Score[5]; ですね。
ishiko

2021/03/02 09:33

では、点数が5つあるということにしたらどうなりますでしょうか? 試しにint Score[1]と直して実行してみたのですが、直りませんでした。
otn

2021/03/02 09:51

fscanf( fp, "%s%s%d %d %d %d %d\n" , data[i].FamilyName, data[i].FirstName, &data[i].Score[0], &data[i].Score[1], &data[i].Score[2], &data[i].Score[3], &data[i].Score[4] ) と、 printf("%s %s %2d %2d %2d %2d %2d\n", data[m].FamilyName, data[m].FirstName, data[m].Score[0], data[m].Score[1], data[m].Score[2], data[m].Score[3], data[m].Score[4] );
ishiko

2021/03/02 09:59

#include <stdio.h> #include <stdlib.h> typedef struct { char FamilyName[32]; char FirstName[32]; int Score[1]; } Student; int main(void) { int i, m; FILE*fp; Student data[50]; // 構造体配列の宣言 fp=fopen("tensu.txt","r"); if(fp == NULL){ perror("ファイルの読み込みに失敗/n"); } for( i = 0; i <= 50; i++ ) { if( fscanf( fp, "%s%s%d\n" , data[i].FamilyName, data[i].FirstName, &data[i].Score[0] ) != 3 ) break; } for(m=0;m<50;m++){ printf("%s %s %d \n", data[m].FamilyName, data[m].FirstName, &data[m].Score[0] ); } fclose( fp ); } というふうに直してみたのですが、変わりません、、
otn

2021/03/02 10:05

直し方が間違っているからですね。コピペが正しく出来ないレベルだと、厳しい。 あと、i 件しか読んでいないときにも50件出力しているので、i+1 件以降はゴミが表示されますね。
ishiko

2021/03/02 10:14

直し方が違うとはどこの部分が違いましたか? 50人分だからi<=50だと思ったのですが、正しくないのですか?
ishiko

2021/03/02 10:30

コピペして点数5つバージョンで実行してみました。 今度は先頭のYamada Hanako 50 30 40 20 40 のみ正しく表示され、あとはなぞの文字やスペース数字などが乱立しました。i+1件以降はごみとはこれのことですかね? ちゃんと全部きれいに表示されるにはどうすればよいですか?
javahack

2021/03/02 10:34

答えを求めてばかりではなく、一旦落ち着いて最初の設計段階から見直してみてはいかがでしょうか。
otn

2021/03/02 10:38

> 直し方が違うとはどこの部分が違いましたか? &の有無に注意が向かないと言うことは、注意力が弱いです。 > ちゃんと全部きれいに表示されるにはどうすればよいですか? 50件でなく、i 件だけ表示すれば良いです。<50 でなく <i 。 もしくは、「ちょうど50件」のデータを用意するか。49件以下だとお書きの状況になり、51件以上あるとメモリ上データを破壊するので駄目ですね。
ishiko

2021/03/02 11:04

!=8に直してみたらうまくいきました! たくさん付き合っていただきありがとうございました。 もう少し自分なりに調べてみますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問