質問編集履歴

1

実際のロジックを追記しました。

2018/09/07 02:38

投稿

siksmtt
siksmtt

スコア20

test CHANGED
File without changes
test CHANGED
@@ -168,9 +168,9 @@
168
168
 
169
169
  ・配列は1024サイズより上回ることはないが、各ループでサイズは異なる
170
170
 
171
- ・コメントアウトで実行する関数に引数として配列が渡されるが、その際初期値の0x00は除かなければならない
171
+ ・コメントアウトで実行する関数に引数として配列が渡されるが、その際初期値の0x00は除かなければならない(※)
172
-
172
+
173
- ・配列はbyteの1次元配列に限定する
173
+ ・配列はbyteの1次元配列に限定する(※)
174
174
 
175
175
  ・ループを何回繰り返すかわからない上、上記1・2点の理由から、while(true)前に予め配列を確保することはできない
176
176
 
@@ -189,3 +189,131 @@
189
189
  他の方法も含めてもしご助言いただけますと幸いです。
190
190
 
191
191
  (C#およびプログラミングを始めて半年と少ししか経っていない初学者ですので、至らぬ点がありましたら申し訳ありません。)
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+ ### 追記(実際にやりたいこと)
200
+
201
+ 実際に制作しているプログラムのロジック(ほぼそのまま)を掲載します。
202
+
203
+ 要件としては
204
+
205
+
206
+
207
+ ・1024バイト毎にファイルの中身を読みとる
208
+
209
+ ・改行コードが見つかったら、もしくはファイルの最後まで読んだら外部関数を実行
210
+
211
+ ・改行コードがあるまでは外部関数は実行しないが、改行コードまでが1MB以上だった場合はエラーとする(未記載)
212
+
213
+
214
+
215
+ 以上になります。
216
+
217
+ 上記3点および前述の(※)については要件として変えられないので、「1024バイトごとではなく一気にファイルを読めばいい」「ReadLineを使って」等は実装として不可能です。
218
+
219
+
220
+
221
+ ```C#
222
+
223
+ string filePath = "任意のテキストファイルのフルパス";
224
+
225
+ byte[] readdata = new byte[1024];
226
+
227
+ byte[] buffer = new byte[1048576]; //1MB
228
+
229
+ int index = 0;
230
+
231
+
232
+
233
+ FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
234
+
235
+
236
+
237
+ while (true)
238
+
239
+ {
240
+
241
+ int readByte = fileStream.Read(readdata, 0, 1024);
242
+
243
+
244
+
245
+ if (readByte == 0)
246
+
247
+ {
248
+
249
+ Array.Resize(ref buffer, index + 1);
250
+
251
+ //外部関数 0x00を除いたbyte配列を引数に指定しなければならない
252
+
253
+ break; //ファイルを全て読んだことになるのでwhile(true)から抜ける
254
+
255
+ }
256
+
257
+
258
+
259
+ foreach (byte byte1 in readdata)
260
+
261
+ {
262
+
263
+ if (byte1 == 0x00)
264
+
265
+ {
266
+
267
+ break;
268
+
269
+ }
270
+
271
+
272
+
273
+ if (byte1 == 0x0a)
274
+
275
+ {
276
+
277
+ buffer[index] = byte1;
278
+
279
+
280
+
281
+ if (buffer[index - 1] == 0x0d)
282
+
283
+ {
284
+
285
+ Array.Resize(ref buffer, index + 1);
286
+
287
+ //外部関数 0x00を除いたbyte配列を引数に指定しなければならない
288
+
289
+ index = 0;
290
+
291
+ Array.Clear(buffer, 0, buffer.Length);
292
+
293
+ Array.Resize(ref buffer, 1048576);
294
+
295
+ continue;
296
+
297
+ }
298
+
299
+
300
+
301
+ index++;
302
+
303
+ }
304
+
305
+
306
+
307
+ buffer[index++] = byte1;
308
+
309
+ }
310
+
311
+ }
312
+
313
+ ```
314
+
315
+
316
+
317
+ 「Array関数を多用している箇所はインスタンス生成やListでどうにかならないかな?その場合どちらを使う方がいいんだろう?」と思い質問させていただいた次第であります。
318
+
319
+ ご助言いただけますと幸いです...!