teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

読み込みたいファイル、mainを追加しました。

2017/09/19 09:33

投稿

ssssskkkkk
ssssskkkkk

スコア20

title CHANGED
File without changes
body CHANGED
@@ -1,24 +1,114 @@
1
- ###実現したこと
1
+ ###ファイルの分割ロードにつ
2
2
  c++でファイルの分割ロードを実現したいと考えています。
3
3
  具体的には、毎フレーム128キロバイトずつ、もしくはまだ読み込めていないサイズの合計が128キロバイト未満であれば、残りサイズを読み込みます。
4
4
 
5
5
  とある本に書いてあったコードを参考に、以下のようなコードを書いてみました。
6
6
 
7
+ ###Fileクラス
8
+
9
+ 実際に読み込むファイルのデータを保持しています。
10
+
7
11
  ```c++
12
+ #ifndef _FILE_H_
13
+ #define _FILE_H_
8
14
 
9
- #ifndef _LOADER_H_
15
+ /*
10
- #define _LOADER_H_
11
16
 
17
+ File.h
18
+
19
+ */
20
+
21
+ #include "Singleton.h"
22
+ #include <string>
23
+
24
+ using namespace std;
25
+
26
+ class File {
27
+
28
+ public:
29
+
30
+ bool isReady() const;
31
+ int size() const;
32
+ const char* data() const;
33
+ string fileName() const;
34
+
35
+ File(const char* fileName);
36
+ ~File() {};
37
+
38
+ private:
39
+
40
+ friend class Loader;
41
+
42
+ string mFileName;
43
+ char* mData;
44
+ int mSize;
45
+
46
+ };
47
+
48
+ #endif
49
+
50
+
51
+ ```
52
+
53
+ ```c++
54
+ #include "File.h"
55
+
12
56
  /*
13
57
 
14
- Loader.h
58
+ File.cpp
15
59
 
60
+ */
61
+
62
+ bool File::isReady() const {
63
+
64
+ return mData != 0;
65
+
66
+ }
67
+
68
+ int File::size() const {
69
+
70
+ return mSize;
71
+
72
+ }
73
+
74
+ const char* File::data() const {
75
+
76
+ return mData;
77
+
78
+ }
79
+
80
+ string File::fileName() const {
81
+
82
+ return mFileName;
83
+
84
+ }
85
+
86
+ File::File(const char* fileName) {
87
+
88
+ mFileName = fileName;
89
+
90
+ mData = 0;
91
+
92
+ }
93
+ ```
94
+
95
+
96
+ ###Loaderクラス
97
+
16
98
  ファイルのロードを行うクラスです。
17
-
18
99
  createFileで読み込みたいファイルのListであるmFilesにファイルの登録を行います。
19
-
20
100
  updateを毎フレーム呼び出し、少しずつファイルを読み込みます。
21
101
 
102
+
103
+ ```c++
104
+
105
+ #ifndef _LOADER_H_
106
+ #define _LOADER_H_
107
+
108
+ /*
109
+
110
+ Loader.h
111
+
22
112
  */
23
113
 
24
114
  #include "Singleton.h"
@@ -125,7 +215,7 @@
125
215
 
126
216
  if (mCurrentFile != nullptr) {
127
217
 
128
- int rest = mFileSize - mSeekPosition;
218
+ int rest = mFileSize - mSeekPosition; // ファイルサイズ - 現在の読み込み位置で、残りのファイルサイズを取得しています。
129
219
 
130
220
  int maxKB = 128 * 1024;
131
221
 
@@ -160,102 +250,52 @@
160
250
  }
161
251
 
162
252
  ```
163
- ```c++
164
- #ifndef _FILE_H_
165
- #define _FILE_H_
166
253
 
167
- /*
254
+ ###読み込むファイル
168
255
 
256
+ Test.txtというファイルを読み込みます。
257
+ 今回は、試しにファイルサイズが小さいものを読み込んでいるので、あまり分割する意味はありませんが、実際にはもっと大きいファイルを読み込みたいと考えています。
169
- File.h
258
+ ```Test.txt
259
+ TEST
260
+ GAMEPROGRAMING
261
+ ```
170
262
 
171
- */
263
+ ###実現したいこと
172
264
 
173
- #include "Singleton.h"
265
+ 上記のTest.txtを読み込み、標準出力に表示したいと思い、mainを以下のように実装したのですが、
174
- #include <string>
266
+ 上手くいきませんでした。
175
267
 
176
- using namespace std;
177
-
178
- class File {
179
-
180
- public:
181
-
182
- bool isReady() const;
183
- int size() const;
184
- const char* data() const;
185
- string fileName() const;
186
-
187
- File(const char* fileName);
188
- ~File() {};
189
-
190
- private:
191
-
192
- friend class Loader;
193
-
194
- string mFileName;
195
- char* mData;
196
- int mSize;
197
-
198
- };
199
-
200
- #endif
201
-
202
-
203
- ```
204
-
205
268
  ```c++
269
+ #include "Loader.h"
206
270
  #include "File.h"
271
+ #include <iostream>
272
+ #include <string>
207
273
 
208
- /*
274
+ using namespace std;
209
275
 
210
- File.cpp
276
+ int main(void) {
211
277
 
212
- */
278
+ File* file = nullptr;
213
279
 
214
- bool File::isReady() const {
280
+ if (file == nullptr) {
215
281
 
216
- return mData != 0;
282
+ Loader::shared().createFile(&file, "Test.txt"); // shared()はシングルトンクラスによって提供されている、唯一のインスタスを返すメソッドです。
217
283
 
218
- }
284
+ }
219
285
 
220
- int File::size() const {
286
+ while (!file->isReady()) { //isReady()は読み込みが終わっているならばtrueを返すので、読み込みが終わっていない間、回ります。
221
287
 
222
- return mSize;
288
+ Loader::shared().update();
223
289
 
224
- }
290
+ }
225
291
 
226
- const char* File::data() const {
292
+ string str(file->data());
227
293
 
228
- return mData;
294
+ cout << str << endl;
229
295
 
230
- }
296
+ return 0;
231
297
 
232
- string File::fileName() const {
233
-
234
- return mFileName;
235
-
236
298
  }
237
-
238
- File::File(const char* fileName) {
239
-
240
- mFileName = fileName;
241
-
242
- mData = 0;
243
-
244
- }
245
299
  ```
246
300
 
247
-
248
- SingletonやDEBUGは割愛します。
249
-
250
-
251
- ###発生している問題
252
-
253
- 特にエラーメッセージが出ているわけではないのですが、このコードで最終的にFileクラスのmDataに読み込んだデータが格納されると踏んでいるのですが、そのような理解で合っているのでしょうか。
254
-
255
- また、上記のような理解であっている場合、FileクラスのmDataにはどのような使い道があるのでしょうか。
256
-
257
- 例えば、txt形式のファイルを読み込んだ場合、どのようにして、mDataからtxt形式のファイルの内容を取り出すことができるのしょうか。
258
-
259
- そもそも、上記のコードでは、読み込みが実現できていない場合は、そちらもご指摘いただけると助かります。
260
-
261
- いくつも質問てしまってお手数をおけしますが、よろしくお願いします。
301
+ どのようにすれば実現できるのでょうよろしくお願いいたします。