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

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

ただいまの
回答率

90.32%

  • C

    3996questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 397

sanchu52

score 142

構造体のデータ(実行時間)がうまく表示されない。
テキストファイルから構造体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秒
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • sanchu52

    2017/09/19 06:22

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

    キャンセル

  • a_saitoh

    2017/09/19 10:41

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

    キャンセル

  • a_saitoh

    2017/09/19 10:42

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

    キャンセル

回答 3

checkベストアンサー

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 16:55

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

    キャンセル

  • 2017/09/17 18:58

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

    キャンセル

  • 2017/09/17 20:59

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

    キャンセル

0

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/17 17:11








    cの教科書で独学中です。バイナリデータを扱う章にきています。おっしゃるとおりfwriteやfreadを使って

    います。




    このプログラムも”r”から”rb”に変更しています。実はラックナンバーサーチの実行時間を記録して、

    履歴の表示、実行時間の短い順に10個表示、最近の10回分の表示を行うプログラムを作って完成出来ていた

    のですが、LACKNUM.DATのデータがおかしくなって、うまく実行できなくなっています。


    後の課題も大体正常動作していたのですがそれもうまくいかなくなったので、
    そのためにLACKNUM.DATを作っているところです。よろしくおねがいいたします。

    キャンセル

  • 2017/09/17 17:14

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

    キャンセル

  • 2017/09/17 21:01

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

    キャンセル

-1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C

    3996questions

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