回答編集履歴

1

追記

2016/02/02 00:38

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -19,3 +19,123 @@
19
19
  もし、両方ともでしたら、両方を同時に進めるのはちょっと骨と思います。
20
20
 
21
21
  後者→前者の順で行うことをお勧めします。
22
+
23
+
24
+
25
+ ---
26
+
27
+ 【追記:mallocで最大記録数を可変対応する方法】
28
+
29
+ 一番問題になるのは、ファイルに記録されているデータの数をどうやって取得するか?です。
30
+
31
+ ①既に実装されている仕組みを流用し、countで計算されているデータの数を使う
32
+
33
+ ②ファイルのサイズを獲得して、データ1つのサイズで割ることでデータの数を計算する
34
+
35
+
36
+
37
+ プログラムの修正量は②の方が少ないので②の方法で提案します。
38
+
39
+
40
+
41
+ **1.下記2つが必要な記憶領域ですが、これをmallocで獲得できるようにします。**
42
+
43
+ ```C
44
+
45
+ BEST_TEN best_ten[100];
46
+
47
+
48
+
49
+ BEST_TEN *best_ten;
50
+
51
+ ```
52
+
53
+ ```C
54
+
55
+ BEST_TEN *plst[NDATA];
56
+
57
+
58
+
59
+ BEST_TEN **plst;
60
+
61
+ ```
62
+
63
+ **2.次にデータ数を求めます**
64
+
65
+ C言語のファイル操作機能には、下記があります。
66
+
67
+ (1)ファイルからデータを読みだす位置を示すファイル位置表示子
68
+
69
+ (2)ファイル位置表示子を指定位置へ移動する([fseek](http://www.c-tipsref.com/reference/stdio/fseek.html))
70
+
71
+ (3)ファイル位置表示子のファイル先頭からのバイト数を求める([fgetpos](http://www.c-tipsref.com/reference/stdio/fgetpos.html))
72
+
73
+
74
+
75
+ これらを使い下記方法にてファイルに記録されているデータのバイト数を調べることができます。
76
+
77
+ a.ファイル位置表示子を最後尾へ移動する(SEEK_END)
78
+
79
+ b.ファイル位置表示子のファイル先頭からのバイト数を求める
80
+
81
+ c.ファイル位置表示子を最後尾へ移動する(SEEK_SET)
82
+
83
+
84
+
85
+ データ1つのバイト数は、`sizeof(struct tm)+sizeof(double)`で計算できますので、b.で求めた値をこの値で割ればデータの数になります。
86
+
87
+
88
+
89
+ この処理は、`printf("\n過去の履歴のコピー\n-------------------------- \n");`文の直前が良いです。
90
+
91
+
92
+
93
+ **3.次に[malloc](http://www.c-tipsref.com/reference/stdlib/malloc.html)でメモリを獲得します**
94
+
95
+ 下記イメージです。
96
+
97
+ ```C
98
+
99
+ #define SIZE (sizeof(struct tm)+sizeof(double)) //A
100
+
101
+ best_ten = (BEST_TEN *)malloc(データ数*SIZE); //B
102
+
103
+ plst= (BEST_TEN **)malloc(データ数*sizeof(BEST_TEN *));//C
104
+
105
+ ```
106
+
107
+ A, B, Cは適切な位置へ置いて下さい。
108
+
109
+ AはNDATAを#defineしている付近が良いです。
110
+
111
+ Bは2.で`データ数`を求めた直後に置く必要があります。
112
+
113
+ Cは`BEST_TEN *plst[NDATA];`→`BEST_TEN **plst;`の直後に置く必要があります。
114
+
115
+
116
+
117
+ 以上で基本的な処理は終わりです。
118
+
119
+ 既に作られている部分は上記の提案部分以外は修正不要な筈です。
120
+
121
+
122
+
123
+ **4.後始末**
124
+
125
+ malloc等で獲得したメモリは解放する必要が有ります。
126
+
127
+ そのために、main()の最後に下記を記述して下さい。
128
+
129
+ ```C
130
+
131
+ free(best_ten );
132
+
133
+ free(plst);
134
+
135
+ ```
136
+
137
+ **5.エラー処理**
138
+
139
+ mallocでデータを獲得できなかった時は、NULLが返ってきます。この時、獲得したかったメモリを使おうとするとプログラムが落ちます。ですので、そのエラー処理を書いておくことが推奨されますが、趣味のプログラムでしたら不要です。できることは、プログラムを終了させることしかありませんので。
140
+
141
+