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

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

ただいまの
回答率

90.99%

  • C

    3081questions

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

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

解決済

回答 3

投稿 編集

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

sanchu52

score 121

構造体のデータ(実行時間)がうまく表示されない。
テキストファイルから構造体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のプログラムの復習をしたいとおもいます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • ただいまの回答率 90.99%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    パイプとc言語

    前提・実現したいこと dateからパイプして、日付を他言語でターミナルに表示できるようにしたいです。フランス語とドイツ語で曜日と月が書いてあるファイルが存在しています(fr.tx

  • 解決済

    [C] fputcがうまく書き込みしてくれないです

    とても見辛く、メソッドも利用しないクソコードで申し訳ありません。 これは、"人の名前(空白)点数"というものが20人分記録されているファイルを点数順にソートして新しいファイルに記

  • 解決済

    構造体のプログラム

    いつもお世話になっています。C言語初心者でただいま勉強中です。構造体について質問させていただきます。ファイルから構造体配列に読み込んで以下のように出力するプログラムを作りたいんです

  • 解決済

    配列

    n個のデータを配列に読み込み、平均と分散を求めるプログラムを作成して、下記のデータで試せ、という問題です。 {3.9,10.4,9.5,7.5,2.8,4.8,2.9,8.1,3

  • 解決済

    C言語の構造体で2分木を作るプログラムの実行時エラーの解決策を教えてください。

    初心者なので不備が多いかと思いますが、とりあえず動くようにしたいです。 自分でいろいろいじってみましたがどうしてもわかりません。 どこをどう直せばいいのかどなたかご教授お願い致

  • 解決済

    [c]一つのデータでカラム数が変わるデータの読み込み

    質問失礼します。プログラム初心者です。 以下のような〜〜〜.datを fp1 = fopen(fname1,"r"); while((ret = fscanf(fp1,"%d %d

  • 解決済

    バブルソートについて

    10個の整数を入力して、それを昇順に並べるプログラムを自分なりに作ってみたのですが、データを入力してもソートされず入力したデータそのものが返ってきてしまい、うまく機能しません。どの

  • 受付中

    プログラムを見やすく改良したい

    正常に動くプルグラムを見やすく改良したい。 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よ

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

  • C

    3081questions

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