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

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

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

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

ファイル

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

ポインタ

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

10550閲覧

構造体の保存(ファイル、読み込み、書き込み、配列)

flower

総合スコア29

C

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

ファイル

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

ポインタ

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/01/16 00:31

###前提・実現したいこと
EclipseでC/C++言語を学んでいます。大学の課題でこんなものが出ました。

typedef struct student{ char name[80]; char id[8]; float gpa; }Student; を定義し、Student students[2]の配列を用意して、 stdin と fscanf を用いて2個のデータをキーボード入力し、 data/data10 に保存し、再び読み込んで、中身を確認せよ。

###試したこと

C++

1#include<stdio.h> 2#include<iostream> 3using namespace std; 4 5typedef struct student{ 6 char name[80]; 7 char id[8]; 8 float gpa; 9}Student; 10 11int main(){ 12 Student students[2]; 13 FILE *fp1=fopen("data/data10","wb"); 14 for(int i=0;i<2;i++){ 15 fscanf(stdin,"名前: %c",&students[i].name); 16 fscanf(stdin,"ID: %c",&students[i].id); 17 fscanf(stdin,"GPA: %f",&students[i].gpa); 18 } 19 fwrite(&students,sizeof(float),2,fp1); 20 fclose(fp1); 21 22 Student copyOfStudents[2]; 23 FILE *fp2=fopen("data/data10","rb"); 24 fread(copyOfStudents,sizeof(float),2,fp2); 25 fclose(fp2); 26 27 for(int i=0;i<2;i++){ 28 fprintf(stdout,"名前: %c\n",&students[i].name); 29 fprintf(stdout,"ID: %c\n",&students[i].id); 30 fprintf(stdout,"GPA: %f\n",&students[i].gpa); 31 } 32}

###問題点・改善したい点
実行すると、本来なら「名前: 」と出てくるはずなのに、
何も出てきません。(エラーもなく実行できていて、入力も可能でした)

/*例えば、 「あ」「あいう」「a」 などの文字列を一つ入力すると、*/ 名前: � ID: 0 GPA: 0.000000 名前: < ID: � GPA: 0.000000 /*のように、空のデータがそのまま 出力されてしまいます。*/

早急に回答してくださると助かります!

###補足情報(言語/FW/ツール等のバージョンなど)
使用ツール:Eclipse CDT4.5.x

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

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

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

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

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

guest

回答3

0

fscanf関数の仕様を調べてみましょう
https://msdn.microsoft.com/ja-jp/library/cb5kac8b.aspx
それが分かれば何が間違っているのか分かると思います

投稿2017/01/16 00:42

ardin

総合スコア544

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

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

flower

2017/01/16 06:39

サイト見てみましたが、あまり理解できませんでした…。 とりあえず、"名前: %c" と "ID: %c" を "名前: %80s" と "ID: %8s" に変えて、sizeof(student) に直して実行してみました。 そしたら、文字化けは起こらなくなりましたが、やっぱり入力がうまくいきません。 分かりやすい説明をお願いしたいです…!
ardin

2017/01/16 13:19 編集

答えそのものを書かなかったのは、fscanfの使い方は難しいので、検索してどういうものかを掴んでもらいたかったからです まず、fscanf(stdin,****)はscanf()と同意です fscanf(stdin,"名前: %80s",&students[i].name); (実は、これでも引数に間違いがあるのですが、scanfを検索してもらえれば、何が間違いか分かります) 解決ヒントの一つ これで入力を促した場合、 名前: ○○ とまで入力してもらう必要があります 名前: を出したい場合は、素直にprintf(今回の場合は、fprintf(stdout,****)が良さそうでしょうか?) なお、fscanfでEnterキーで文字入力した場合の注意点もいろいろ書かれているはずなので注意してください あと fprintfは読み出したcopyOfStudentsを利用していません
guest

0

色々と原因箇所があると思われますが・・・
まず、ardinさんが指摘されているように、fscanfの仕様を確認して間違い箇所を把握しましょう。
つぎにfwrite/freadの部分、float2のサイズしか書き出してないです。構造体のサイズ2を
書き(読み)出さないとやりたいことは実現できないです。

投稿2017/01/16 00:59

Take-y

総合スコア91

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

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

0

課題の意図がよくわかりませんでしたのでお答にはなっておりません、ご参考程度のものです。

g++

1#include<stdio.h> 2#include<iostream> 3#include<fstream> 4using namespace std; 5 6typedef struct student{ 7 char name[80]; 8 char id[8]; 9 float gpa; 10}Student; 11 12int main(){ 13 Student students[2] = {}; 14 15 float gpa; 16 for(int i=0;i<2;i++){ 17 fprintf(stdout,"名前:"); 18 fscanf(stdin,"%s",&students[i].name); 19 fprintf(stdout,"ID:"); 20 fscanf(stdin,"%s",&students[i].id); 21 fprintf(stdout,"GPA:"); 22 fscanf(stdin,"%f",&students[i].gpa); 23 } 24 25 ofstream outfile("test.txt"); 26 if(outfile.fail()) { 27 cerr << "File Error for Output" << endl; 28 return 3; 29 } 30 31 for(int i=0;i<2;i++){ 32 outfile << students[i].name << endl; 33 outfile << students[i].id << endl; 34 outfile << students[i].gpa << endl; 35 } 36 outfile.close(); 37 38 ifstream inpfile("test.txt"); 39 if(inpfile.fail()) { 40 cerr << "File dose not exists" << endl; 41 return 3; 42 } 43 44 Student students2[2] = {}; 45 for(int i=0;i<2;i++){ 46 inpfile >> students2[i].name; 47 inpfile >> students2[i].id; 48 inpfile >> fixed >> students2[i].gpa; 49 } 50 inpfile.close(); 51 52 for(int i=0;i<2;i++){ 53 cout << "名前:" << students2[i].name << endl; 54 cout << "ID:" << students2[i].id << endl; 55 cout << "GPA:" << students2[i].gpa << endl; 56 } 57}

投稿2017/01/16 23:36

A.Ichi

総合スコア4070

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問