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

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

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

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

Q&A

解決済

3回答

1267閲覧

構造体のデータ(実行時間)がうまく表示されない

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2017/09/17 06:32

編集2017/09/18 21:19

構造体のデータ(実行時間)がうまく表示されない。
テキストファイルから構造体score_dataに"LACKNUM.DAT"という名前を付けてデータを入れたのですが、これを別のプログラムで使うとうまく表示されません。"LACKNUM.DAT"をバイナリデータで使いたいのです。
構造体のサイズが関係しているのでしょうか?正常に表示されるよう
ご教授いただけませんか。欠けている情報がありましたら、おしらせください。
構造体の"LACKNUM.DAT"は<time.h>のtmと同じサイズにしたいのですが。

#include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXCNT 100 typedef struct { // 構造体の宣言 int tm_year; int tm_mon; int tm_mday; int tm_hour; int tm_min; int tm_sec; double score; } score_data; int main() { int i, count=0; FILE *fp; score_data stars[MAXCNT]; // 構造体配列の宣言 if( (fp=fopen( "LACKNUM.DAT", "r" )) == NULL ) { printf( "ファイルがオープンできません\n" ); exit( 1 ); } for( i = 0; i < MAXCNT; i++ ) { if( fscanf( fp, "%d %d %d %d %d %d %lf\n" // 構造体配列への読み込み , &stars[i].tm_year,& stars[i].tm_mon, &stars[i].tm_mday, &stars[i].tm_hour, &stars[i].tm_min,&stars[i].tm_sec,&stars[i].score ) != 7 ) break; count++; } fclose( fp ); if( (fp=fopen( "LACKNUM.DAT", "r")) == NULL ) { printf( "ファイルがオープンできません\n" ); exit( 1 ); } printf("count%d\n",count); for(i = 0; i < count; i++ ){ printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n所要時間(score)は%.1f\n" // 構造体配列への読み込み , stars[i].tm_year,stars[i].tm_mon,stars[i].tm_mday, stars[i].tm_hour,stars[i].tm_min,stars[i].tm_sec,stars[i].score); } fclose(fp); return 0; } /* データファイル starsdata.txt を下記とすると 2017 9 16 8 52 18 10.6 2015 12 7 19 9 59 8.0 2016 1 4 1 9 11 7.5 2016 1 4 19 16 8 9.0 2016 1 4 19 2 44 7.5 2016 1 4 22 31 52 9.3 2016 1 4 23 33 50 10.2 2016 1 31 21 9 53 7.0 2016 2 2 8 49 9.4 2016 2 27 12 4E 13.0 2016 2 28 2 27 20 7.4 2016 5 2 16 43 6.3 2017 9 14 10 21 18 6.0 これをバイナリデータに変換したつもりの"LACKNUM.DAT"を使って実行しています。 32 30 31 37 20 20 39 20 31 36 20 20 38 20 20 31 38 20 31 30 2E 36 0D 0A 32 30 31 35 20 31 32 20 20 37 20 31 39 20 20 35 39 20 20 38 2E 30 0D 0A 32 30 31 36 20 20 31 20 20 34 20 20 31 20 20 39 20 31 31 20 37 2E 35 0D 0A 32 30 31 36 20 20 31 20 20 20 34 20 31 39 20 31 36 20 20 38 20 20 39 2E 30 0D 0A 32 30 31 36 20 20 31 20 20 34 20 31 39 20 20 32 20 34 34 20 20 37 2E 35 0D 0A 32 30 31 36 20 20 31 20 20 34 20 32 32 20 33 31 20 35 32 20 39 2E 33 0D 0A 32 30 31 36 20 20 31 20 20 34 20 32 33 20 33 33 20 35 30 20 31 30 2E 32 0D 0A 32 30 31 36 20 20 31 20 33 31 20 32 31 20 20 39 20 35 33 20 20 37 2E 30 0D 0A 32 30 31 36 20 20 32 20 20 32 20 20 38 20 34 39 20 20 39 20 20 39 2E 34 0D 0A 32 30 31 36 20 20 32 20 32 37 20 20 31 32 20 34 35 20 32 36 20 31 33 2E 30 0D 0A 32 30 31 36 20 20 32 20 32 38 20 20 32 20 32 37 20 32 30 20 20 37 2E 34 0D 0A 32 30 31 36 20 20 35 20 20 32 20 31 36 20 34 33 20 33 32 20 20 36 2E 33 0D 0A 32 30 31 37 20 20 39 20 31 34 20 31 30 20 32 31 20 31 38 20 20 36 2E 30 0D 0A 実行結果は C:\MinGW\users\chap09\kadai>gcc -I. -o test4 test4.c -Wall C:\MinGW\users\chap09\kadai>test4 count13 2017年 9月 16日 8時 52分 18秒 所要時間(score)は10.6 2015年 12月 7日 19時 9分 59秒 所要時間(score)は8.0 2016年 1月 4日 1時 9分 11秒 所要時間(score)は7.5 2016年 1月 4日 19時 16分 8秒 所要時間(score)は9.0 2016年 1月 4日 19時 2分 44秒 所要時間(score)は7.5 2016年 1月 4日 22時 31分 52秒 所要時間(score)は9.3 2016年 1月 4日 23時 33分 50秒 所要時間(score)は10.2 2016年 1月 31日 21時 9分 53秒 所要時間(score)は7.0 2016年 2月 2日 8時 49分 9秒 所要時間(score)は9.4 2016年 2月 27日 12時 45分 26秒 所要時間(score)は13.0 2016年 2月 28日 2時 27分 20秒 所要時間(score)は7.4 2016年 5月 2日 16時 43分 32秒 所要時間(score)は6.3 2017年 9月 14日 10時 21分 18秒 所要時間(score)は6.0 C:\MinGW\users\chap09\kadai> 別のプログラムの実行結果 C:\MinGW\users\chap09\kadai>gcc -I. -o kadai9-1-2 kadai9-1-2.c pdcurses.a C:\MinGW\users\chap09\kadai>kadai9-1-2 過去の履歴 -------------------------- 221656476年 824195122月 540161312日 941629494時 824195360分 925970482秒 得点(所要時間)は0.0秒 221590947年 540094753月 958411040日 874524960時 909193266分 168636462秒 得点(所要時間)は0.0秒

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

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

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

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

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

cateye

2017/09/17 09:52

テキスト(読み込み)→バイナリ(書き出し)→バイナリ(読み込み)→表示と動作すると思いますが、LACKNUM.DAT(テキスト?)の読み込みと表示しかないように見えますが?
退会済みユーザー

退会済みユーザー

2017/09/17 11:54

すみません明日仕事なのでまたやってみます。ありがとうございます。
a_saitoh

2017/09/17 13:25

「"LACKNUM.DAT"という名前を付けてデータを入れた」入れ方がわからないと、読み出しプログラムだけ見てもアドバイスは困難です。
退会済みユーザー

退会済みユーザー

2017/09/18 21:22

すみません。一応"LACKNUM.DAT"のデータを追加しましたがこれでなんとかなりまか。
a_saitoh

2017/09/19 01:41

バイナリに変換できてません。もとのテキストファイルと全く同じ(ヘキサダンプしただけ)ですが・・。
a_saitoh

2017/09/19 01:42

同じじゃないですね。201xの次の空白文字が、元テキストファイルでは1文字ですがlackum.datでは1文字だったり2文字だったりまちまちに変わってます。
guest

回答3

0

printfの説明を構造体配列への読み出しに変更し、"LACKNUM.DAT"の"r"を"rb"に変更。
バイナリデータ、テキストデータ(追加)の表示が正常にひょうじされました。壊れたデータ"LACKNUM.DAT"が
作れたので。本題の課題9-1のプログラムの復習をしたいとおもいます。

投稿2017/09/19 00:55

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

fopen()のパラメータ"r" はテキスト用です。バイナリ読み込み("rb")を使いましょう。その後fread()でstarsに読み込めばいい。各関数の使い方は
C言語関数辞典
などで調べてみましょう。
・・また、maisumakunさんの言うように、テキストにしたほうが何かと便利ですよd^^
[追記]
勘違いか("; テキストファイルを読んでる?・・・いらん事を言ってしまったような;;申し訳ないm(")m
で、テキストの場合は、fgets()で読み込んでsscanf()で変換するのが問題が起こりにくいですよd^^;
あと、fscanf()の"%d %d~"の間の空白ですが、私は分かりにくいので"%d,%d~"と言うように','(カンマ)を入れるようにしています。こんな感じ→sscanf(line.c_str(),"%lf,%lf,%lf",・・・・

投稿2017/09/17 07:21

編集2017/09/17 09:34
cateye

総合スコア6851

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

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

退会済みユーザー

退会済みユーザー

2017/09/17 07:55

c言語の教科書のプログラムを実行中です。今ちょうどバイナリデータを扱ったプログラムのところです。 ありがとうございます。
cateye

2017/09/17 09:58

追記依頼にも書きましたが、元のテキストファイル(starsdata.txt?)はどこで読み込んでいるのでしょう? また変換後のバイナリデータの書き出しはどこでやってるのでしょうか? 別のプログラムでしょうか? プログラム自体はどういう動きにしたいのでしょうか?
退会済みユーザー

退会済みユーザー

2017/09/17 11:59

テキストに切り替えて正常に表示するようにコードを書き換えていますが、もう寝ます。ありがとうございます。テキストデータは正常表示します。変換後のバイナリデータの書き出しもできましたが、別の正常に動いたプログラムでは、もう少しのところまで行っています。あさってやるつもりでいます。そのときまたお願いします。
guest

0

まず最初に、バイナリデータを扱いたいのなら、printfscanfではなく(これらはテキストの入出力用です)、fwritefreadを使うものです。

そして、「別のプログラムで使う」ような可搬性のあるデータであれば、(バイナリでどういう形式になっているのか決まっているものや、テキストにすると冗長になりすぎるマルチメディア系のデータなどは除いて)テキストのままやり取りするほうが便利です。最近は、Microsoft Officeのファイル形式すら、XMLをzipで固めたものになっています。

バイナリデータを扱うとなれば、環境の違いでビット数やエンディアンなどの違いが出るので、そこまで含めて慎重に作る必要があります。テキストであれば、その差は気にしなくても良くなります。

投稿2017/09/17 07:09

編集2017/09/17 07:10
maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2017/09/17 08:11

cの教科書で独学中です。バイナリデータを扱う章にきています。おっしゃるとおりfwriteやfreadを使って います。 このプログラムも”r”から”rb”に変更しています。実はラックナンバーサーチの実行時間を記録して、 履歴の表示、実行時間の短い順に10個表示、最近の10回分の表示を行うプログラムを作って完成出来ていた のですが、LACKNUM.DATのデータがおかしくなって、うまく実行できなくなっています。 後の課題も大体正常動作していたのですがそれもうまくいかなくなったので、 そのためにLACKNUM.DATを作っているところです。よろしくおねがいいたします。
maisumakun

2017/09/17 08:14

その、freadやfwriteしているコードがないので、なんとも言いようがない状態です。
退会済みユーザー

退会済みユーザー

2017/09/17 12:01

すみません。テキストデータに切り替えて格闘しています。明後日またやるつもりです。maisumakunさんありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問