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

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

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

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

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

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

Q&A

解決済

3回答

2075閲覧

日付・時刻を直接バイナリファイルに読み書きするプログラム

kelt22

総合スコア46

C

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

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

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

0グッド

0クリップ

投稿2020/02/26 04:41

質問

日付・時刻をstruct tm型の値として直接バイナリファイルに読み書きするようなプログラムを書きたいです。エラーは出ませんが実行がうまくできません。fwrite,fread関数の書き方が正しくないためこのような結果になっていると考えていますが、具体的にどこが間違っているか解説していただくと有難いです。また、fprintf,fscanf関数を用いればプログラムを書くことができるのですがバイナリファイルの読み書きにfprintf,fscanf関数を用いてもいいのでしょうか?

該当のソースコード

c

1#include<stdio.h> 2#include<time.h> 3char date_file[]="a.out"; 4void get_dat(void){ 5 FILE *fp; 6 if((fp=fopen(date_file,"rb"))==NULL) 7 printf("本プログラムを実行するのは初めてですね\n"); 8 else{ 9 struct tm *time1; 10 fread(time1,sizeof(struct tm),1,fp); 11 printf("前回は%d年%d月%d日%d時%d分%d秒でした。\n",time1->tm_year,time1->tm_mon,time1->tm_mday,time1->tm_hour,time1->tm_min,time1->tm_sec); 12 fclose(fp); 13 } 14} 15void put_date(void){ 16 FILE *fp; 17 time_t current=time(NULL); 18 struct tm *timer=localtime(&current); 19 if((fp=fopen(date_file,"wb"))==NULL) 20 printf("ファイルをオープンできません\n"); 21else{ 22 fwrite(timer,sizeof(struct tm),1,fp); 23 fclose(fp); 24} 25} 26int main(void){ 27 get_dat(); 28 put_date(); 29 return 0; 30}

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

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

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

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

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

cateye

2020/02/26 04:57 編集

環境が分からないのでなんとも言えませんが・・・ char date_file[]="a.out"; はおかしいです。 a.outと言うファイル名はUNIX系OSで、assembler out putの略で、コンパイル時に、実行ファイル名を指定しない場合に出力される実行ファイルの名前です。
guest

回答3

0

struct tm *time1;
fread(time1,sizeof(struct tm),1,fp);

どこに読込結果を格納するつもりなのでしょうか?

投稿2020/02/26 04:49

fana

総合スコア11632

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

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

fana

2020/02/26 05:45 編集

これだけで話としては十分であろうと思ったのだが.
guest

0

以下のようにしてください。
修正個所は//修正のコメントを入れてます。

C

1#include<stdio.h> 2#include<time.h> 3char date_file[]="a.out"; 4void get_dat(void){ 5 FILE *fp; 6 if((fp=fopen(date_file,"rb"))==NULL) 7 printf("本プログラムを実行するのは初めてですね\n"); 8 else{ 9 struct tm time1; //修正 10 fread(&time1,sizeof(struct tm),1,fp); //修正 11 printf("前回は%d年%d月%d日%d時%d分%d秒でした。\n",time1.tm_year+1900,time1.tm_mon+1,time1.tm_mday,time1.tm_hour,time1.tm_min,time1.tm_sec); //修正 12 fclose(fp); 13 } 14} 15void put_date(void){ 16 FILE *fp; 17 time_t current=time(NULL); 18 struct tm *timer=localtime(&current); 19 if((fp=fopen(date_file,"wb"))==NULL) 20 printf("ファイルをオープンできません\n"); 21else{ 22 fwrite(timer,sizeof(struct tm),1,fp); 23 fclose(fp); 24} 25} 26int main(void){ 27 get_dat(); 28 put_date(); 29 return 0; 30} 31

投稿2020/02/26 05:13

tatsu99

総合スコア5424

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

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

0

ベストアンサー

こんにちは。
ポインタをもう少し学習したほうが良いと思います。

struct tm *time1;
fread(time1,sizeof(struct tm),1,fp);

⇒ freadでメモリ破壊を起こします。
∵time1 はポインタのみでメモリ実体がないからです。
struct tm time1; /* time1を実体として宣言して /
fread(&time1, sizeof(time1), 1, fp); /
time1のポインタに読み込む */

投稿2020/02/26 04:57

DreamTheater

総合スコア1095

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

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

kelt22

2020/02/26 07:38

理解できました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問