質問編集履歴

6

誤字

2017/08/03 05:50

投稿

hinatti
hinatti

スコア14

test CHANGED
File without changes
test CHANGED
@@ -18,7 +18,7 @@
18
18
 
19
19
  ###発生している問題・エラーメッセージ
20
20
 
21
- 16個しか表示しない
21
+ 1しか表示しない
22
22
 
23
23
 
24
24
 

5

インデント

2017/08/03 05:49

投稿

hinatti
hinatti

スコア14

test CHANGED
File without changes
test CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  その後別関数でファイルの内容を16個ずつ表示させたいです。
8
8
 
9
+ (ブロックサイズを256とした場合16行表示させる)
10
+
9
11
 
10
12
 
11
13
 
@@ -16,7 +18,7 @@
16
18
 
17
19
  ###発生している問題・エラーメッセージ
18
20
 
19
- 1しか表示しない
21
+ 16個しか表示しない
20
22
 
21
23
 
22
24
 
@@ -674,7 +676,7 @@
674
676
 
675
677
  int output = 0;//出力数
676
678
 
677
- int out = 0;//出力文字数
679
+ int out = 0;//出力文字数
678
680
 
679
681
  int line_number;//行番号
680
682
 

4

問題の修正

2017/08/03 05:49

投稿

hinatti
hinatti

スコア14

test CHANGED
File without changes
test CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  ###発生している問題・エラーメッセージ
18
18
 
19
- 同じ16個がループまって
19
+ 1か表示
20
20
 
21
21
 
22
22
 

3

文法の修正

2017/08/03 04:18

投稿

hinatti
hinatti

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,4 @@
1
- ```###前提・実現したいこと
1
+ ###前提・実現したいこと
2
2
 
3
3
  今C言語でファイルダンププログラムを作成しています。
4
4
 
@@ -8,893 +8,897 @@
8
8
 
9
9
 
10
10
 
11
+
12
+
13
+
14
+
15
+
16
+
11
17
  ###発生している問題・エラーメッセージ
12
18
 
13
-
19
+ 同じ16個がループしてしまっている
20
+
21
+
22
+
23
+
24
+
25
+ ###該当のソースコード
26
+
27
+
28
+
29
+
30
+
31
+ ```C言語
32
+
33
+ #include <stdio.h>
34
+
35
+ #include <conio.h>
36
+
37
+ #include <stdlib.h>
38
+
39
+ #include <string.h>
40
+
41
+ #include <math.h>
42
+
43
+
44
+
45
+ #define RET_OK 1 //判定フラグ
46
+
47
+ #define RET_ESC 0 //ESCキー判定
48
+
49
+ #define DISPLAY_MAX_ONE 16 //表示フォーマット1の出力最大桁数
50
+
51
+ #define DISPLAY_MAX_TWO 64 //表示フォーマット2の出力最大桁数
52
+
53
+ #define MAX 256 //最大文字数
54
+
55
+
56
+
57
+ typedef struct _DumpData{
58
+
59
+ unsigned char fileName[MAX]; //ファイル名
60
+
61
+ unsigned char data[10000]; //読み込んだデータ
62
+
63
+ long size; //ファイル容量
64
+
65
+ int contents; //freadの戻り値
66
+
67
+ int blockSize; //ブロックサイズ
68
+
69
+ int totalBlock; //総ブロック数
70
+
71
+ FILE* file_pointer; //ファイルポインタ
72
+
73
+ int format; //表示フォーマット
74
+
75
+ int chinese_characters; //漢字表示
76
+
77
+ int blockNumber; //現在のブロック番号
78
+
79
+ unsigned char errorField[40]; //エラー表示フィールド
80
+
81
+ } DumpData;
82
+
83
+
84
+
85
+ //関数プロトタイプ宣言
86
+
87
+ //ファイル名入力関数
88
+
89
+ short file_name(DumpData* pointer);
90
+
91
+
92
+
93
+ //ブロックサイズ入力関数
94
+
95
+ short block_size(DumpData* pointer);
96
+
97
+
98
+
99
+ //総ブロック数算出関数
100
+
101
+ void totalBlock_calculation(DumpData* pointer);
102
+
103
+
104
+
105
+ //ファイル要素表示関数
106
+
107
+ void file_element(DumpData* pointer);
108
+
109
+
110
+
111
+ //ファイルを読み取る関数
112
+
113
+ void file_read(DumpData* pointer);
114
+
115
+
116
+
117
+ //表示ファイル形式1関数
118
+
119
+ void file_display_one(DumpData* pointer);
120
+
121
+
122
+
123
+ //メイン関数
124
+
125
+ int main(void)
126
+
127
+ {
128
+
129
+ short ret;
130
+
131
+ char key_data;
132
+
133
+
134
+
135
+ //構造体DATEの初期化
136
+
137
+ DumpData DATA =
138
+
139
+ {
140
+
141
+ {'\0'}, //ファイル名
142
+
143
+ {'\0'}, //読み込んだデータ
144
+
145
+ {0}, //ファイル容量
146
+
147
+ {0}, //freadの戻り値
148
+
149
+ {0}, //ブロックサイズ
150
+
151
+ {0}, //総ブロック数
152
+
153
+ {'\0'}, //ファイルポインタ
154
+
155
+ {1}, //表示フォーマット
156
+
157
+ {0}, //漢字表示
158
+
159
+ {1}, //現在のブロック番号
160
+
161
+ {'\0'}, //エラー表示フィールド
162
+
163
+ };
164
+
165
+
166
+
167
+ DumpData* data;//構造体のポインタ宣言
168
+
169
+ data = &DATA;//ポインタdataに構造体DATEの先頭アドレスを代入
170
+
171
+
172
+
173
+ printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
174
+
175
+ printf("* * * * * * * *\n");
176
+
177
+ printf("* * * * * * * *\n");
178
+
179
+ printf("* * * * ファイルダンプ Ver 1.00 * * * *\n");
180
+
181
+ printf("* * * * * * * *\n");
182
+
183
+ printf("* * * * * * * *\n");
184
+
185
+ printf("* * * * * * * *\n");
186
+
187
+ printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
188
+
189
+
190
+
191
+ //ファイル名入力関数の呼び出し
192
+
193
+ ret = file_name(data);
194
+
195
+ if (ret != RET_OK)
196
+
197
+ {
198
+
199
+ return 0;//プログラムを終了
200
+
201
+ }
202
+
203
+
204
+
205
+ //ブロックサイズ入力関数の呼び出し
206
+
207
+ ret = block_size(data);
208
+
209
+ if (ret != RET_OK)
210
+
211
+ {
212
+
213
+ return 0;//プログラムを終了
214
+
215
+ }
216
+
217
+
218
+
219
+ //総ブロック数算出関数の呼び出し
220
+
221
+ totalBlock_calculation(data);
222
+
223
+
224
+
225
+
226
+
227
+ file_element(data);//ファイル要素表示関数の呼び出し
228
+
229
+
230
+
231
+ file_read(data);//ファイル読み込み関数の呼び出し
232
+
233
+
234
+
235
+ file_display_one(data);
236
+
237
+
238
+
239
+ }
240
+
241
+
242
+
243
+ //ファイル名入力関数
244
+
245
+ short file_name(DumpData* pointer)
246
+
247
+ {
248
+
249
+ char key;
250
+
251
+ short judgment_flag;//判定フラグ
252
+
253
+ long character_number;//文字数
254
+
255
+
256
+
257
+ // ファイルを開くか、ESCキーが入力されるまで
258
+
259
+ judgment_flag = RET_OK;
260
+
261
+ pointer->file_pointer = NULL;
262
+
263
+ while ((pointer->file_pointer == NULL) &&
264
+
265
+ (judgment_flag == RET_OK))
266
+
267
+ {
268
+
269
+ printf("\n ファイル名を入力してください\n>");
270
+
271
+
272
+
273
+ //文字数が256文字以下の間
274
+
275
+ for (character_number = 0; character_number < 255; character_number++)
276
+
277
+ {
278
+
279
+ key = (char)_getch();
280
+
281
+
282
+
283
+ //ESCキーを押下した時
284
+
285
+ if (key == 0x1b)
286
+
287
+ {
288
+
289
+ judgment_flag = RET_ESC;//判定フラグを0にする
290
+
291
+ break;
292
+
293
+ }
294
+
295
+
296
+
297
+ //エンターキーを押下した時
298
+
299
+ if (key == 0x0d)
300
+
301
+ {
302
+
303
+ break;//入力終了
304
+
305
+ }
306
+
307
+
308
+
309
+ //いずれのキーも押下していないとき
310
+
311
+ putchar(key);//1文字ずつ出力
312
+
313
+ pointer->fileName[character_number] = key;//出力した文字を1文字ずつ構造体のファイル名に格納
314
+
315
+ }
316
+
317
+
318
+
319
+ // ファイル名が入力された場合(=Escキーが押されなかった場合)
320
+
321
+ if (judgment_flag == RET_OK)
322
+
323
+ {
324
+
325
+ pointer->fileName[character_number] = '\0';//ファイル名の最後にヌルを入れる
326
+
327
+
328
+
329
+ // ファイルを開く
330
+
331
+ pointer->file_pointer = fopen((char*)&pointer->fileName[0], "rb");
332
+
333
+
334
+
335
+ // ファイルが開けなかった場合
336
+
337
+ if (pointer->file_pointer == NULL)
338
+
339
+ {
340
+
341
+ printf("\n<<ファイルが見つかりません>>");
342
+
343
+ }
344
+
345
+ }
346
+
347
+ }
348
+
349
+
350
+
351
+ return judgment_flag;//判定フラグを返す
352
+
353
+ }
354
+
355
+
356
+
357
+ //ブロックサイズ入力関数
358
+
359
+ short block_size(DumpData* pointer)
360
+
361
+ {
362
+
363
+ short judgment_flag;//判定フラグ
364
+
365
+ char key;
366
+
367
+
368
+
369
+ // ブロックサイズを指定するか、ESCキーが入力されるまで
370
+
371
+ pointer->blockSize = 0;
372
+
373
+ judgment_flag = RET_OK;
374
+
375
+ while ((pointer->blockSize == 0) &&
376
+
377
+ (judgment_flag == RET_OK))
378
+
379
+ {
380
+
381
+ printf("\n ブロックサイズを指定してください\n");
382
+
383
+ printf(" ( (1)64 (2)128 (3)256 ) >");
384
+
385
+ key = (char)_getch();
386
+
387
+
388
+
389
+ //ESCキーが押下された場合
390
+
391
+ if (key == 0x1b)
392
+
393
+ {
394
+
395
+ judgment_flag = RET_ESC;//判定フラグを0にする
396
+
397
+ break;
398
+
399
+ }
400
+
401
+
402
+
403
+ putchar(key);
404
+
405
+
406
+
407
+ switch (key)
408
+
409
+ {
410
+
411
+ //入力した数が1の場合
412
+
413
+ case '1':
414
+
415
+ pointer->blockSize = 64;//構造体のブロックサイズに格納
416
+
417
+ break;
418
+
419
+
420
+
421
+ //入力した数が2の場合
422
+
423
+ case '2':
424
+
425
+ pointer->blockSize = 128;//構造体のブロックサイズに格納
426
+
427
+ break;
428
+
429
+
430
+
431
+ //入力した数が3の場合
432
+
433
+ case '3':
434
+
435
+ pointer->blockSize = 256;//構造体のブロックサイズに格納
436
+
437
+ break;
438
+
439
+
440
+
441
+ //1,2,3,ESCキーのいずれでも無い場合
442
+
443
+ default:
444
+
445
+ printf("\n<<該当する項目がありません>>");
446
+
447
+ break;
448
+
449
+ }
450
+
451
+ }
452
+
453
+
454
+
455
+ return judgment_flag;//判定フラグを返す
456
+
457
+ }
458
+
459
+
460
+
461
+ //総ブロック数算出関数
462
+
463
+ void totalBlock_calculation(DumpData* pointer)
464
+
465
+ {
466
+
467
+ double calculation;//計算結果
468
+
469
+ double check;
470
+
471
+ int location = 0;
472
+
473
+
474
+
475
+ //ファイルの最後までシーク
476
+
477
+ location = fseek(pointer->file_pointer, 0, SEEK_END);
478
+
479
+
480
+
481
+ //fseekのエラー検査
482
+
483
+ if (location != 0)
484
+
485
+ {
486
+
487
+ strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
488
+
489
+ }
490
+
491
+ else
492
+
493
+ {
494
+
495
+ //ファイルの容量を取得する
496
+
497
+ pointer->size = ftell(pointer->file_pointer);
498
+
499
+
500
+
501
+ //総ブロック数の計算
502
+
503
+ calculation = (double)pointer->size / (double)pointer->blockSize;
504
+
505
+
506
+
507
+ //小数点以下を切り上げる
508
+
509
+ check = ceil(calculation);
510
+
511
+
512
+
513
+ pointer->totalBlock = (int)check;//構造体の総ブロック数に格納
514
+
515
+ }
516
+
517
+ }
518
+
519
+
520
+
521
+ //ファイル要素表示関数
522
+
523
+ void file_element(DumpData* pointer)
524
+
525
+ {
526
+
527
+ printf("\n\n ファイル名:%s", pointer->fileName);
528
+
529
+ printf(" 総ブロック数:%d", pointer->totalBlock);
530
+
531
+ printf(" ブロックサイズ:%d\n", pointer->blockSize);
532
+
533
+
534
+
535
+ //フォーマットが1の時
536
+
537
+ if (pointer->format == 1)
538
+
539
+ {
540
+
541
+ printf("\n 表示フォーマット1");
542
+
543
+ }
544
+
545
+ //フォーマットが2の時
546
+
547
+ else
548
+
549
+ {
550
+
551
+ printf("\n 表示フォーマット2");
552
+
553
+ }
554
+
555
+
556
+
557
+ //漢字表示が0の時
558
+
559
+ if (pointer->chinese_characters == 0)
560
+
561
+ {
562
+
563
+ printf(" 漢字表示OFF\n");
564
+
565
+ }
566
+
567
+ //漢字表示が1の時
568
+
569
+ else
570
+
571
+ {
572
+
573
+ printf(" 漢字表示ON\n");
574
+
575
+ }
576
+
577
+
578
+
579
+ printf(" ブロック番号:%d", pointer->blockNumber);
580
+
581
+ printf(" [%-40s ]\n", pointer->errorField);
582
+
583
+ }
584
+
585
+
586
+
587
+ //ファイルを読み取る関数
588
+
589
+ void file_read(DumpData* pointer)
590
+
591
+ {
592
+
593
+ int location = 0;
594
+
595
+
596
+
597
+ //先頭ページのとき
598
+
599
+ if (pointer->blockNumber == 1)
600
+
601
+ {
602
+
603
+ location = fseek(pointer->file_pointer, 0, SEEK_SET);
604
+
605
+ }
606
+
607
+
608
+
609
+ //fseekのエラー検査
610
+
611
+ if (location != 0)
612
+
613
+ {
614
+
615
+ strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
616
+
617
+ }
618
+
619
+ else
620
+
621
+ {
622
+
623
+ pointer->contents = fread(pointer->data, sizeof(unsigned char), pointer->size, pointer->file_pointer);
624
+
625
+
626
+
627
+ //freadの戻り値が要素数より少ない時
628
+
629
+ if (pointer->blockSize > pointer->contents)
630
+
631
+ {
632
+
633
+ //feofの戻り値が0以外のときエラー
634
+
635
+ if (feof(pointer->file_pointer) != 0)
636
+
637
+ {
638
+
639
+ strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
640
+
641
+ }
642
+
643
+ else
644
+
645
+ {
646
+
647
+ strcpy((char*)&pointer->errorField[0], "");//構造体のエラー表示フィールドに格納
648
+
649
+ }
650
+
651
+ }
652
+
653
+ else
654
+
655
+ {
656
+
657
+ strcpy((char*)&pointer->errorField[0], "");//構造体のエラー表示フィールドに格納
658
+
659
+ }
660
+
661
+ }
662
+
663
+ }
664
+
665
+
666
+
667
+ //表示ファイル形式1関数
668
+
669
+ void file_display_one(DumpData* pointer)
670
+
671
+ {
672
+
673
+ int key;
674
+
675
+ int output = 0;//出力数
676
+
677
+ int out = 0;//出力文字数
678
+
679
+ int line_number;//行番号
680
+
681
+ short character_flag = 0;//文字フラグ
682
+
683
+
684
+
685
+ printf(" Addr Hex ASCII\n");
686
+
687
+
688
+
689
+ //選択したブロックサイズ÷16した数が行番号より大きい間繰り返し
690
+
691
+ line_number = 0;
692
+
693
+ while ((pointer->blockSize / DISPLAY_MAX_ONE) > line_number)
694
+
695
+ {
696
+
697
+ //行番号の表示
698
+
699
+ printf(" %05X ", line_number);
700
+
701
+
702
+
703
+ //16個出力するまでループ
704
+
705
+ for (; DISPLAY_MAX_ONE > output; output++)
706
+
707
+ {
708
+
709
+ //freadの戻り値が出力数より大きいとき
710
+
711
+ if (pointer->contents > output)
712
+
713
+ {
714
+
715
+ //8個目と9個目の間に"-"表示
716
+
717
+ if (output == 7)
718
+
719
+ {
720
+
721
+ printf("%02X-", pointer->data[output]);
722
+
723
+ }
724
+
725
+ else
726
+
727
+ {
728
+
729
+ printf("%02X ", pointer->data[output]);
730
+
731
+ }
732
+
733
+ }
734
+
735
+ else
736
+
737
+ {
738
+
739
+ printf(" ");
740
+
741
+ }
742
+
743
+ }
744
+
745
+
746
+
747
+ //16文字出力するまでループ
748
+
749
+ for (; DISPLAY_MAX_ONE > out; out++)
750
+
751
+ {
752
+
753
+ //freadの戻り値が出力数より大きいとき
754
+
755
+ if (pointer->contents > out)
756
+
757
+ {
758
+
759
+ key = pointer->data[out];
760
+
761
+
762
+
763
+ //漢字表示ONの時(SHIFT-JIS)
764
+
765
+ if (pointer->chinese_characters == 1)
766
+
767
+ {
768
+
769
+ //全角文字の1byte目の時
770
+
771
+ if ((key >= 0x81 && key <= 0x9f) || (key >= 0xe0 && key <= 0xfc))
772
+
773
+ {
774
+
775
+ //出力文字数が16の時
776
+
777
+ if (out == 15)
778
+
779
+ {
780
+
781
+ putchar('$');
782
+
783
+ character_flag = RET_OK;//文字フラグを1にする
784
+
785
+ }
786
+
787
+ else
788
+
789
+ {
790
+
791
+ putchar(key);
792
+
793
+ }
794
+
795
+ }
796
+
797
+ else
798
+
799
+ {
800
+
801
+ //文字フラグが1の時
802
+
803
+ if (character_flag == RET_OK)
804
+
805
+ {
806
+
807
+ putchar('$');
808
+
809
+ character_flag = 0;//文字フラグを0にする
810
+
811
+ }
812
+
813
+ //半角文字の時
814
+
815
+ else if ((key >= 0x20) && (key <= 0x7e))
816
+
817
+ {
818
+
819
+ putchar(key);
820
+
821
+ }
822
+
823
+ //全角文字、半角文字でもない場合
824
+
825
+ else
826
+
827
+ {
828
+
829
+ putchar('$');
830
+
831
+ }
832
+
833
+ }
834
+
835
+ }
836
+
837
+ //漢字表示OFFの時(ASCII)
838
+
839
+ else
840
+
841
+ {
842
+
843
+ //半角文字の時
844
+
845
+ if ((key >= 0x20) && (key <= 0x7e))
846
+
847
+ {
848
+
849
+ putchar(key);
850
+
851
+ }
852
+
853
+ else
854
+
855
+ {
856
+
857
+ putchar('$');
858
+
859
+ }
860
+
861
+ }
862
+
863
+ }
864
+
865
+ else
866
+
867
+ {
868
+
869
+ putchar(' ');
870
+
871
+ }
872
+
873
+ }
874
+
875
+
876
+
877
+ line_number++;//行番号のカウントアップ
878
+
879
+ printf("\n");
880
+
881
+
882
+
883
+ //4行出力ごとに改行
884
+
885
+ if ((line_number % 4) == 0)
886
+
887
+ {
888
+
889
+ printf("\n");
890
+
891
+ }
892
+
893
+ }
894
+
895
+ }
14
896
 
15
897
  ```
16
898
 
17
- 同じ16個がループしてしまっている
18
-
19
- ```
20
-
21
-
22
-
23
- ###該当のソースコード
24
-
25
- ```C言語
26
-
27
- ```ここに言語を入力
28
-
29
- #include <stdio.h>
30
-
31
- #include <conio.h>
32
-
33
- #include <stdlib.h>
34
-
35
- #include <string.h>
36
-
37
- #include <math.h>
38
-
39
-
40
-
41
- #define RET_OK 1 //判定フラグ
42
-
43
- #define RET_ESC 0 //ESCキー判定
44
-
45
- #define DISPLAY_MAX_ONE 16 //表示フォーマット1の出力最大桁数
46
-
47
- #define DISPLAY_MAX_TWO 64 //表示フォーマット2の出力最大桁数
48
-
49
- #define MAX 256 //最大文字数
50
-
51
-
52
-
53
- typedef struct _DumpData{
54
-
55
- unsigned char fileName[MAX]; //ファイル名
56
-
57
- unsigned char data[10000]; //読み込んだデータ
58
-
59
- long size; //ファイル容量
60
-
61
- int contents; //freadの戻り値
62
-
63
- int blockSize; //ブロックサイズ
64
-
65
- int totalBlock; //総ブロック数
66
-
67
- FILE* file_pointer; //ファイルポインタ
68
-
69
- int format; //表示フォーマット
70
-
71
- int chinese_characters; //漢字表示
72
-
73
- int blockNumber; //現在のブロック番号
74
-
75
- unsigned char errorField[40]; //エラー表示フィールド
76
-
77
- } DumpData;
78
-
79
-
80
-
81
- //関数プロトタイプ宣言
82
-
83
- //ファイル名入力関数
84
-
85
- short file_name(DumpData* pointer);
86
-
87
-
88
-
89
- //ブロックサイズ入力関数
90
-
91
- short block_size(DumpData* pointer);
92
-
93
-
94
-
95
- //総ブロック数算出関数
96
-
97
- void totalBlock_calculation(DumpData* pointer);
98
-
99
-
100
-
101
- //ファイル要素表示関数
102
-
103
- void file_element(DumpData* pointer);
104
-
105
-
106
-
107
- //ファイルを読み取る関数
108
-
109
- void file_read(DumpData* pointer);
110
-
111
-
112
-
113
- //表示ファイル形式1関数
114
-
115
- void file_display_one(DumpData* pointer);
116
-
117
-
118
-
119
- //メイン関数
120
-
121
- int main(void)
122
-
123
- {
124
-
125
- short ret;
126
-
127
- char key_data;
128
-
129
-
130
-
131
- //構造体DATEの初期化
132
-
133
- DumpData DATA =
134
-
135
- {
136
-
137
- {'\0'}, //ファイル名
138
-
139
- {'\0'}, //読み込んだデータ
140
-
141
- {0}, //ファイル容量
142
-
143
- {0}, //freadの戻り値
144
-
145
- {0}, //ブロックサイズ
146
-
147
- {0}, //総ブロック数
148
-
149
- {'\0'}, //ファイルポインタ
150
-
151
- {1}, //表示フォーマット
152
-
153
- {0}, //漢字表示
154
-
155
- {1}, //現在のブロック番号
156
-
157
- {'\0'}, //エラー表示フィールド
158
-
159
- };
160
-
161
-
162
-
163
- DumpData* data;//構造体のポインタ宣言
164
-
165
- data = &DATA;//ポインタdataに構造体DATEの先頭アドレスを代入
166
-
167
-
168
-
169
- printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
170
-
171
- printf("* * * * * * * *\n");
172
-
173
- printf("* * * * * * * *\n");
174
-
175
- printf("* * * * ファイルダンプ Ver 1.00 * * * *\n");
176
-
177
- printf("* * * * * * * *\n");
178
-
179
- printf("* * * * * * * *\n");
180
-
181
- printf("* * * * * * * *\n");
182
-
183
- printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
184
-
185
-
186
-
187
- //ファイル名入力関数の呼び出し
188
-
189
- ret = file_name(data);
190
-
191
- if (ret != RET_OK)
192
-
193
- {
194
-
195
- return 0;//プログラムを終了
196
-
197
- }
198
-
199
-
200
-
201
- //ブロックサイズ入力関数の呼び出し
202
-
203
- ret = block_size(data);
204
-
205
- if (ret != RET_OK)
206
-
207
- {
208
-
209
- return 0;//プログラムを終了
210
-
211
- }
212
-
213
-
214
-
215
- //総ブロック数算出関数の呼び出し
216
-
217
- totalBlock_calculation(data);
218
-
219
-
220
-
221
-
222
-
223
- file_element(data);//ファイル要素表示関数の呼び出し
224
-
225
-
226
-
227
- file_read(data);//ファイル読み込み関数の呼び出し
228
-
229
-
230
-
231
- file_display_one(data);
232
-
233
-
234
-
235
- }
236
-
237
-
238
-
239
- //ファイル名入力関数
240
-
241
- short file_name(DumpData* pointer)
242
-
243
- {
244
-
245
- char key;
246
-
247
- short judgment_flag;//判定フラグ
248
-
249
- long character_number;//文字数
250
-
251
-
252
-
253
- // ファイルを開くか、ESCキーが入力されるまで
254
-
255
- judgment_flag = RET_OK;
256
-
257
- pointer->file_pointer = NULL;
258
-
259
- while ((pointer->file_pointer == NULL) &&
260
-
261
- (judgment_flag == RET_OK))
262
-
263
- {
264
-
265
- printf("\n ファイル名を入力してください\n>");
266
-
267
-
268
-
269
- //文字数が256文字以下の間
270
-
271
- for (character_number = 0; character_number < 255; character_number++)
272
-
273
- {
274
-
275
- key = (char)_getch();
276
-
277
-
278
-
279
- //ESCキーを押下した時
280
-
281
- if (key == 0x1b)
282
-
283
- {
284
-
285
- judgment_flag = RET_ESC;//判定フラグを0にする
286
-
287
- break;
288
-
289
- }
290
-
291
-
292
-
293
- //エンターキーを押下した時
294
-
295
- if (key == 0x0d)
296
-
297
- {
298
-
299
- break;//入力終了
300
-
301
- }
302
-
303
-
304
-
305
- //いずれのキーも押下していないとき
306
-
307
- putchar(key);//1文字ずつ出力
308
-
309
- pointer->fileName[character_number] = key;//出力した文字を1文字ずつ構造体のファイル名に格納
310
-
311
- }
312
-
313
-
314
-
315
- // ファイル名が入力された場合(=Escキーが押されなかった場合)
316
-
317
- if (judgment_flag == RET_OK)
318
-
319
- {
320
-
321
- pointer->fileName[character_number] = '\0';//ファイル名の最後にヌルを入れる
322
-
323
-
324
-
325
- // ファイルを開く
326
-
327
- pointer->file_pointer = fopen((char*)&pointer->fileName[0], "rb");
328
-
329
-
330
-
331
- // ファイルが開けなかった場合
332
-
333
- if (pointer->file_pointer == NULL)
334
-
335
- {
336
-
337
- printf("\n<<ファイルが見つかりません>>");
338
-
339
- }
340
-
341
- }
342
-
343
- }
344
-
345
-
346
-
347
- return judgment_flag;//判定フラグを返す
348
-
349
- }
350
-
351
-
352
-
353
- //ブロックサイズ入力関数
354
-
355
- short block_size(DumpData* pointer)
356
-
357
- {
358
-
359
- short judgment_flag;//判定フラグ
360
-
361
- char key;
362
-
363
-
364
-
365
- // ブロックサイズを指定するか、ESCキーが入力されるまで
366
-
367
- pointer->blockSize = 0;
368
-
369
- judgment_flag = RET_OK;
370
-
371
- while ((pointer->blockSize == 0) &&
372
-
373
- (judgment_flag == RET_OK))
374
-
375
- {
376
-
377
- printf("\n ブロックサイズを指定してください\n");
378
-
379
- printf(" ( (1)64 (2)128 (3)256 ) >");
380
-
381
- key = (char)_getch();
382
-
383
-
384
-
385
- //ESCキーが押下された場合
386
-
387
- if (key == 0x1b)
388
-
389
- {
390
-
391
- judgment_flag = RET_ESC;//判定フラグを0にする
392
-
393
- break;
394
-
395
- }
396
-
397
-
398
-
399
- putchar(key);
400
-
401
-
402
-
403
- switch (key)
404
-
405
- {
406
-
407
- //入力した数が1の場合
408
-
409
- case '1':
410
-
411
- pointer->blockSize = 64;//構造体のブロックサイズに格納
412
-
413
- break;
414
-
415
-
416
-
417
- //入力した数が2の場合
418
-
419
- case '2':
420
-
421
- pointer->blockSize = 128;//構造体のブロックサイズに格納
422
-
423
- break;
424
-
425
-
426
-
427
- //入力した数が3の場合
428
-
429
- case '3':
430
-
431
- pointer->blockSize = 256;//構造体のブロックサイズに格納
432
-
433
- break;
434
-
435
-
436
-
437
- //1,2,3,ESCキーのいずれでも無い場合
438
-
439
- default:
440
-
441
- printf("\n<<該当する項目がありません>>");
442
-
443
- break;
444
-
445
- }
446
-
447
- }
448
-
449
-
450
-
451
- return judgment_flag;//判定フラグを返す
452
-
453
- }
454
-
455
-
456
-
457
- //総ブロック数算出関数
458
-
459
- void totalBlock_calculation(DumpData* pointer)
460
-
461
- {
462
-
463
- double calculation;//計算結果
464
-
465
- double check;
466
-
467
- int location = 0;
468
-
469
-
470
-
471
- //ファイルの最後までシーク
472
-
473
- location = fseek(pointer->file_pointer, 0, SEEK_END);
474
-
475
-
476
-
477
- //fseekのエラー検査
478
-
479
- if (location != 0)
480
-
481
- {
482
-
483
- strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
484
-
485
- }
486
-
487
- else
488
-
489
- {
490
-
491
- //ファイルの容量を取得する
492
-
493
- pointer->size = ftell(pointer->file_pointer);
494
-
495
-
496
-
497
- //総ブロック数の計算
498
-
499
- calculation = (double)pointer->size / (double)pointer->blockSize;
500
-
501
-
502
-
503
- //小数点以下を切り上げる
504
-
505
- check = ceil(calculation);
506
-
507
-
508
-
509
- pointer->totalBlock = (int)check;//構造体の総ブロック数に格納
510
-
511
- }
512
-
513
- }
514
-
515
-
516
-
517
- //ファイル要素表示関数
518
-
519
- void file_element(DumpData* pointer)
520
-
521
- {
522
-
523
- printf("\n\n ファイル名:%s", pointer->fileName);
524
-
525
- printf(" 総ブロック数:%d", pointer->totalBlock);
526
-
527
- printf(" ブロックサイズ:%d\n", pointer->blockSize);
528
-
529
-
530
-
531
- //フォーマットが1の時
532
-
533
- if (pointer->format == 1)
534
-
535
- {
536
-
537
- printf("\n 表示フォーマット1");
538
-
539
- }
540
-
541
- //フォーマットが2の時
542
-
543
- else
544
-
545
- {
546
-
547
- printf("\n 表示フォーマット2");
548
-
549
- }
550
-
551
-
552
-
553
- //漢字表示が0の時
554
-
555
- if (pointer->chinese_characters == 0)
556
-
557
- {
558
-
559
- printf(" 漢字表示OFF\n");
560
-
561
- }
562
-
563
- //漢字表示が1の時
564
-
565
- else
566
-
567
- {
568
-
569
- printf(" 漢字表示ON\n");
570
-
571
- }
572
-
573
-
574
-
575
- printf(" ブロック番号:%d", pointer->blockNumber);
576
-
577
- printf(" [%-40s ]\n", pointer->errorField);
578
-
579
- }
580
-
581
-
582
-
583
- //ファイルを読み取る関数
584
-
585
- void file_read(DumpData* pointer)
586
-
587
- {
588
-
589
- int location = 0;
590
-
591
-
592
-
593
- //先頭ページのとき
594
-
595
- if (pointer->blockNumber == 1)
596
-
597
- {
598
-
599
- location = fseek(pointer->file_pointer, 0, SEEK_SET);
600
-
601
- }
602
-
603
-
604
-
605
- //fseekのエラー検査
606
-
607
- if (location != 0)
608
-
609
- {
610
-
611
- strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
612
-
613
- }
614
-
615
- else
616
-
617
- {
618
-
619
- pointer->contents = fread(pointer->data, sizeof(unsigned char), pointer->size, pointer->file_pointer);
620
-
621
-
622
-
623
- //freadの戻り値が要素数より少ない時
624
-
625
- if (pointer->blockSize > pointer->contents)
626
-
627
- {
628
-
629
- //feofの戻り値が0以外のときエラー
630
-
631
- if (feof(pointer->file_pointer) != 0)
632
-
633
- {
634
-
635
- strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
636
-
637
- }
638
-
639
- else
640
-
641
- {
642
-
643
- strcpy((char*)&pointer->errorField[0], "");//構造体のエラー表示フィールドに格納
644
-
645
- }
646
-
647
- }
648
-
649
- else
650
-
651
- {
652
-
653
- strcpy((char*)&pointer->errorField[0], "");//構造体のエラー表示フィールドに格納
654
-
655
- }
656
-
657
- }
658
-
659
- }
660
-
661
-
662
-
663
- //表示ファイル形式1関数
664
-
665
- void file_display_one(DumpData* pointer)
666
-
667
- {
668
-
669
- int key;
670
-
671
- int output;//出力桁数
672
-
673
- int line_number;//行番号
674
-
675
- short character_flag = 0;//文字フラグ
676
-
677
-
678
-
679
- printf(" Addr Hex ASCII\n");
680
-
681
-
682
-
683
- //選択したブロックサイズ÷16した数が行番号より大きい間繰り返し
684
-
685
- line_number = 0;
686
-
687
- while ((pointer->blockSize / DISPLAY_MAX_ONE) > line_number)
688
-
689
- {
690
-
691
- //行番号の表示
692
-
693
- printf(" %05X ", line_number);
694
-
695
-
696
-
697
- //16個出力するまでループ
698
-
699
- for (output = 0; DISPLAY_MAX_ONE > output; output++)
700
-
701
- {
702
-
703
- //freadの戻り値が出力数より大きいとき
704
-
705
- if (pointer->contents > output)
706
-
707
- {
708
-
709
- //8個目と9個目の間に"-"表示
710
-
711
- if (output == 7)
712
-
713
- {
714
-
715
- printf("%02X-", pointer->data[output]);
716
-
717
- }
718
-
719
- else
720
-
721
- {
722
-
723
- printf("%02X ", pointer->data[output]);
724
-
725
- }
726
-
727
- }
728
-
729
- else
730
-
731
- {
732
-
733
- printf(" ");
734
-
735
- }
736
-
737
- }
738
-
739
-
740
-
741
- //16文字出力するまでループ
742
-
743
- for (output = 0; DISPLAY_MAX_ONE > output; output++)
744
-
745
- {
746
-
747
- //freadの戻り値が出力数より大きいとき
748
-
749
- if (pointer->contents > output)
750
-
751
- {
752
-
753
- key = pointer->data[output];
754
-
755
-
756
-
757
- //漢字表示ONの時(SHIFT-JIS)
758
-
759
- if (pointer->chinese_characters == 1)
760
-
761
- {
762
-
763
- //全角文字の1byte目の時
764
-
765
- if ((key >= 0x81 && key <= 0x9f) || (key >= 0xe0 && key <= 0xfc))
766
-
767
- {
768
-
769
- //出力文字数が16の時
770
-
771
- if (output == 15)
772
-
773
- {
774
-
775
- putchar('$');
776
-
777
- character_flag = RET_OK;//文字フラグを1にする
778
-
779
- }
780
-
781
- else
782
-
783
- {
784
-
785
- putchar(key);
786
-
787
- }
788
-
789
- }
790
-
791
- else
792
-
793
- {
794
-
795
- //文字フラグが1の時
796
-
797
- if (character_flag == RET_OK)
798
-
799
- {
800
-
801
- putchar('$');
802
-
803
- character_flag = 0;//文字フラグを0にする
804
-
805
- }
806
-
807
- //半角文字の時
808
-
809
- else if ((key >= 0x20) && (key <= 0x7e))
810
-
811
- {
812
-
813
- putchar(key);
814
-
815
- }
816
-
817
- //全角文字、半角文字でもない場合
818
-
819
- else
820
-
821
- {
822
-
823
- putchar('$');
824
-
825
- }
826
-
827
- }
828
-
829
- }
830
-
831
- //漢字表示OFFの時(ASCII)
832
-
833
- else
834
-
835
- {
836
-
837
- //半角文字の時
838
-
839
- if ((key >= 0x20) && (key <= 0x7e))
840
-
841
- {
842
-
843
- putchar(key);
844
-
845
- }
846
-
847
- else
848
-
849
- {
850
-
851
- putchar('$');
852
-
853
- }
854
-
855
- }
856
-
857
- }
858
-
859
- else
860
-
861
- {
862
-
863
- putchar(' ');
864
-
865
- }
866
-
867
- }
868
-
869
-
870
-
871
- line_number++;//行番号のカウントアップ
872
-
873
- printf("\n");
874
-
875
-
876
-
877
- //4行出力ごとに改行
878
-
879
- if ((line_number % 4) == 0)
880
-
881
- {
882
-
883
- printf("\n");
884
-
885
- }
886
-
887
- }
888
-
889
- }
890
-
891
- ```
892
-
893
-
894
-
895
-
896
-
897
- ```
899
+
900
+
901
+
898
902
 
899
903
 
900
904
 

2

,,,の部分を削除

2017/08/03 03:26

投稿

hinatti
hinatti

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,907 +1,903 @@
1
+ ```###前提・実現したいこと
2
+
3
+ 今C言語でファイルダンププログラムを作成しています。
4
+
5
+ 別関数でファイルのデータを一括で読み込んで構造体に持たせ、
6
+
7
+ その後別関数でファイルの内容を16個ずつ表示させたいです。
8
+
9
+
10
+
11
+ ###発生している問題・エラーメッセージ
12
+
13
+
14
+
1
15
  ```
2
16
 
17
+ 同じ16個がループしてしまっている
18
+
3
19
  ```
4
20
 
5
- ```###前提・実現したいこと
6
-
7
- 今C言語でファイルダンププログラムを作成しています。
8
-
9
- 別関数でファイルのデータを一括で読み込んで構造体に持たせ、
10
-
11
- その後別関数でファイルの内容16個ずつ表示させたいです。
12
-
13
-
14
-
15
- ###発生している問題・エラーメッセージ
16
-
17
-
21
+
22
+
23
+ ###該当のソースコード
24
+
25
+ ```C言語
26
+
27
+ ```ここに言語入力
28
+
29
+ #include <stdio.h>
30
+
31
+ #include <conio.h>
32
+
33
+ #include <stdlib.h>
34
+
35
+ #include <string.h>
36
+
37
+ #include <math.h>
38
+
39
+
40
+
41
+ #define RET_OK 1 //判定フラグ
42
+
43
+ #define RET_ESC 0 //ESCキー判定
44
+
45
+ #define DISPLAY_MAX_ONE 16 //表示フォーマット1の出力最大桁数
46
+
47
+ #define DISPLAY_MAX_TWO 64 //表示フォーマット2の出力最大桁数
48
+
49
+ #define MAX 256 //最大文字数
50
+
51
+
52
+
53
+ typedef struct _DumpData{
54
+
55
+ unsigned char fileName[MAX]; //ファイル名
56
+
57
+ unsigned char data[10000]; //読み込んだデータ
58
+
59
+ long size; //ファイル容量
60
+
61
+ int contents; //freadの戻り値
62
+
63
+ int blockSize; //ブロックサイズ
64
+
65
+ int totalBlock; //総ブロック数
66
+
67
+ FILE* file_pointer; //ファイルポインタ
68
+
69
+ int format; //表示フォーマット
70
+
71
+ int chinese_characters; //漢字表示
72
+
73
+ int blockNumber; //現在のブロック番号
74
+
75
+ unsigned char errorField[40]; //エラー表示フィールド
76
+
77
+ } DumpData;
78
+
79
+
80
+
81
+ //関数プロトタイプ宣言
82
+
83
+ //ファイル名入力関数
84
+
85
+ short file_name(DumpData* pointer);
86
+
87
+
88
+
89
+ //ブロックサイズ入力関数
90
+
91
+ short block_size(DumpData* pointer);
92
+
93
+
94
+
95
+ //総ブロック数算出関数
96
+
97
+ void totalBlock_calculation(DumpData* pointer);
98
+
99
+
100
+
101
+ //ファイル要素表示関数
102
+
103
+ void file_element(DumpData* pointer);
104
+
105
+
106
+
107
+ //ファイルを読み取る関数
108
+
109
+ void file_read(DumpData* pointer);
110
+
111
+
112
+
113
+ //表示ファイル形式1関数
114
+
115
+ void file_display_one(DumpData* pointer);
116
+
117
+
118
+
119
+ //メイン関数
120
+
121
+ int main(void)
122
+
123
+ {
124
+
125
+ short ret;
126
+
127
+ char key_data;
128
+
129
+
130
+
131
+ //構造体DATEの初期化
132
+
133
+ DumpData DATA =
134
+
135
+ {
136
+
137
+ {'\0'}, //ファイル名
138
+
139
+ {'\0'}, //読み込んだデータ
140
+
141
+ {0}, //ファイル容量
142
+
143
+ {0}, //freadの戻り値
144
+
145
+ {0}, //ブロックサイズ
146
+
147
+ {0}, //総ブロック数
148
+
149
+ {'\0'}, //ファイルポインタ
150
+
151
+ {1}, //表示フォーマット
152
+
153
+ {0}, //漢字表示
154
+
155
+ {1}, //現在のブロック番号
156
+
157
+ {'\0'}, //エラー表示フィールド
158
+
159
+ };
160
+
161
+
162
+
163
+ DumpData* data;//構造体のポインタ宣言
164
+
165
+ data = &DATA;//ポインタdataに構造体DATEの先頭アドレスを代入
166
+
167
+
168
+
169
+ printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
170
+
171
+ printf("* * * * * * * *\n");
172
+
173
+ printf("* * * * * * * *\n");
174
+
175
+ printf("* * * * ファイルダンプ Ver 1.00 * * * *\n");
176
+
177
+ printf("* * * * * * * *\n");
178
+
179
+ printf("* * * * * * * *\n");
180
+
181
+ printf("* * * * * * * *\n");
182
+
183
+ printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
184
+
185
+
186
+
187
+ //ファイル名入力関数の呼び出し
188
+
189
+ ret = file_name(data);
190
+
191
+ if (ret != RET_OK)
192
+
193
+ {
194
+
195
+ return 0;//プログラムを終了
196
+
197
+ }
198
+
199
+
200
+
201
+ //ブロックサイズ入力関数の呼び出し
202
+
203
+ ret = block_size(data);
204
+
205
+ if (ret != RET_OK)
206
+
207
+ {
208
+
209
+ return 0;//プログラムを終了
210
+
211
+ }
212
+
213
+
214
+
215
+ //総ブロック数算出関数の呼び出し
216
+
217
+ totalBlock_calculation(data);
218
+
219
+
220
+
221
+
222
+
223
+ file_element(data);//ファイル要素表示関数の呼び出し
224
+
225
+
226
+
227
+ file_read(data);//ファイル読み込み関数の呼び出し
228
+
229
+
230
+
231
+ file_display_one(data);
232
+
233
+
234
+
235
+ }
236
+
237
+
238
+
239
+ //ファイル名入力関数
240
+
241
+ short file_name(DumpData* pointer)
242
+
243
+ {
244
+
245
+ char key;
246
+
247
+ short judgment_flag;//判定フラグ
248
+
249
+ long character_number;//文字数
250
+
251
+
252
+
253
+ // ファイルを開くか、ESCキーが入力されるまで
254
+
255
+ judgment_flag = RET_OK;
256
+
257
+ pointer->file_pointer = NULL;
258
+
259
+ while ((pointer->file_pointer == NULL) &&
260
+
261
+ (judgment_flag == RET_OK))
262
+
263
+ {
264
+
265
+ printf("\n ファイル名を入力してください\n>");
266
+
267
+
268
+
269
+ //文字数が256文字以下の間
270
+
271
+ for (character_number = 0; character_number < 255; character_number++)
272
+
273
+ {
274
+
275
+ key = (char)_getch();
276
+
277
+
278
+
279
+ //ESCキーを押下した時
280
+
281
+ if (key == 0x1b)
282
+
283
+ {
284
+
285
+ judgment_flag = RET_ESC;//判定フラグを0にする
286
+
287
+ break;
288
+
289
+ }
290
+
291
+
292
+
293
+ //エンターキーを押下した時
294
+
295
+ if (key == 0x0d)
296
+
297
+ {
298
+
299
+ break;//入力終了
300
+
301
+ }
302
+
303
+
304
+
305
+ //いずれのキーも押下していないとき
306
+
307
+ putchar(key);//1文字ずつ出力
308
+
309
+ pointer->fileName[character_number] = key;//出力した文字を1文字ずつ構造体のファイル名に格納
310
+
311
+ }
312
+
313
+
314
+
315
+ // ファイル名が入力された場合(=Escキーが押されなかった場合)
316
+
317
+ if (judgment_flag == RET_OK)
318
+
319
+ {
320
+
321
+ pointer->fileName[character_number] = '\0';//ファイル名の最後にヌルを入れる
322
+
323
+
324
+
325
+ // ファイルを開く
326
+
327
+ pointer->file_pointer = fopen((char*)&pointer->fileName[0], "rb");
328
+
329
+
330
+
331
+ // ファイルが開けなかった場合
332
+
333
+ if (pointer->file_pointer == NULL)
334
+
335
+ {
336
+
337
+ printf("\n<<ファイルが見つかりません>>");
338
+
339
+ }
340
+
341
+ }
342
+
343
+ }
344
+
345
+
346
+
347
+ return judgment_flag;//判定フラグを返す
348
+
349
+ }
350
+
351
+
352
+
353
+ //ブロックサイズ入力関数
354
+
355
+ short block_size(DumpData* pointer)
356
+
357
+ {
358
+
359
+ short judgment_flag;//判定フラグ
360
+
361
+ char key;
362
+
363
+
364
+
365
+ // ブロックサイズを指定するか、ESCキーが入力されるまで
366
+
367
+ pointer->blockSize = 0;
368
+
369
+ judgment_flag = RET_OK;
370
+
371
+ while ((pointer->blockSize == 0) &&
372
+
373
+ (judgment_flag == RET_OK))
374
+
375
+ {
376
+
377
+ printf("\n ブロックサイズを指定してください\n");
378
+
379
+ printf(" ( (1)64 (2)128 (3)256 ) >");
380
+
381
+ key = (char)_getch();
382
+
383
+
384
+
385
+ //ESCキーが押下された場合
386
+
387
+ if (key == 0x1b)
388
+
389
+ {
390
+
391
+ judgment_flag = RET_ESC;//判定フラグを0にする
392
+
393
+ break;
394
+
395
+ }
396
+
397
+
398
+
399
+ putchar(key);
400
+
401
+
402
+
403
+ switch (key)
404
+
405
+ {
406
+
407
+ //入力した数が1の場合
408
+
409
+ case '1':
410
+
411
+ pointer->blockSize = 64;//構造体のブロックサイズに格納
412
+
413
+ break;
414
+
415
+
416
+
417
+ //入力した数が2の場合
418
+
419
+ case '2':
420
+
421
+ pointer->blockSize = 128;//構造体のブロックサイズに格納
422
+
423
+ break;
424
+
425
+
426
+
427
+ //入力した数が3の場合
428
+
429
+ case '3':
430
+
431
+ pointer->blockSize = 256;//構造体のブロックサイズに格納
432
+
433
+ break;
434
+
435
+
436
+
437
+ //1,2,3,ESCキーのいずれでも無い場合
438
+
439
+ default:
440
+
441
+ printf("\n<<該当する項目がありません>>");
442
+
443
+ break;
444
+
445
+ }
446
+
447
+ }
448
+
449
+
450
+
451
+ return judgment_flag;//判定フラグを返す
452
+
453
+ }
454
+
455
+
456
+
457
+ //総ブロック数算出関数
458
+
459
+ void totalBlock_calculation(DumpData* pointer)
460
+
461
+ {
462
+
463
+ double calculation;//計算結果
464
+
465
+ double check;
466
+
467
+ int location = 0;
468
+
469
+
470
+
471
+ //ファイルの最後までシーク
472
+
473
+ location = fseek(pointer->file_pointer, 0, SEEK_END);
474
+
475
+
476
+
477
+ //fseekのエラー検査
478
+
479
+ if (location != 0)
480
+
481
+ {
482
+
483
+ strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
484
+
485
+ }
486
+
487
+ else
488
+
489
+ {
490
+
491
+ //ファイルの容量を取得する
492
+
493
+ pointer->size = ftell(pointer->file_pointer);
494
+
495
+
496
+
497
+ //総ブロック数の計算
498
+
499
+ calculation = (double)pointer->size / (double)pointer->blockSize;
500
+
501
+
502
+
503
+ //小数点以下を切り上げる
504
+
505
+ check = ceil(calculation);
506
+
507
+
508
+
509
+ pointer->totalBlock = (int)check;//構造体の総ブロック数に格納
510
+
511
+ }
512
+
513
+ }
514
+
515
+
516
+
517
+ //ファイル要素表示関数
518
+
519
+ void file_element(DumpData* pointer)
520
+
521
+ {
522
+
523
+ printf("\n\n ファイル名:%s", pointer->fileName);
524
+
525
+ printf(" 総ブロック数:%d", pointer->totalBlock);
526
+
527
+ printf(" ブロックサイズ:%d\n", pointer->blockSize);
528
+
529
+
530
+
531
+ //フォーマットが1の時
532
+
533
+ if (pointer->format == 1)
534
+
535
+ {
536
+
537
+ printf("\n 表示フォーマット1");
538
+
539
+ }
540
+
541
+ //フォーマットが2の時
542
+
543
+ else
544
+
545
+ {
546
+
547
+ printf("\n 表示フォーマット2");
548
+
549
+ }
550
+
551
+
552
+
553
+ //漢字表示が0の時
554
+
555
+ if (pointer->chinese_characters == 0)
556
+
557
+ {
558
+
559
+ printf(" 漢字表示OFF\n");
560
+
561
+ }
562
+
563
+ //漢字表示が1の時
564
+
565
+ else
566
+
567
+ {
568
+
569
+ printf(" 漢字表示ON\n");
570
+
571
+ }
572
+
573
+
574
+
575
+ printf(" ブロック番号:%d", pointer->blockNumber);
576
+
577
+ printf(" [%-40s ]\n", pointer->errorField);
578
+
579
+ }
580
+
581
+
582
+
583
+ //ファイルを読み取る関数
584
+
585
+ void file_read(DumpData* pointer)
586
+
587
+ {
588
+
589
+ int location = 0;
590
+
591
+
592
+
593
+ //先頭ページのとき
594
+
595
+ if (pointer->blockNumber == 1)
596
+
597
+ {
598
+
599
+ location = fseek(pointer->file_pointer, 0, SEEK_SET);
600
+
601
+ }
602
+
603
+
604
+
605
+ //fseekのエラー検査
606
+
607
+ if (location != 0)
608
+
609
+ {
610
+
611
+ strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
612
+
613
+ }
614
+
615
+ else
616
+
617
+ {
618
+
619
+ pointer->contents = fread(pointer->data, sizeof(unsigned char), pointer->size, pointer->file_pointer);
620
+
621
+
622
+
623
+ //freadの戻り値が要素数より少ない時
624
+
625
+ if (pointer->blockSize > pointer->contents)
626
+
627
+ {
628
+
629
+ //feofの戻り値が0以外のときエラー
630
+
631
+ if (feof(pointer->file_pointer) != 0)
632
+
633
+ {
634
+
635
+ strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
636
+
637
+ }
638
+
639
+ else
640
+
641
+ {
642
+
643
+ strcpy((char*)&pointer->errorField[0], "");//構造体のエラー表示フィールドに格納
644
+
645
+ }
646
+
647
+ }
648
+
649
+ else
650
+
651
+ {
652
+
653
+ strcpy((char*)&pointer->errorField[0], "");//構造体のエラー表示フィールドに格納
654
+
655
+ }
656
+
657
+ }
658
+
659
+ }
660
+
661
+
662
+
663
+ //表示ファイル形式1関数
664
+
665
+ void file_display_one(DumpData* pointer)
666
+
667
+ {
668
+
669
+ int key;
670
+
671
+ int output;//出力桁数
672
+
673
+ int line_number;//行番号
674
+
675
+ short character_flag = 0;//文字フラグ
676
+
677
+
678
+
679
+ printf(" Addr Hex ASCII\n");
680
+
681
+
682
+
683
+ //選択したブロックサイズ÷16した数が行番号より大きい間繰り返し
684
+
685
+ line_number = 0;
686
+
687
+ while ((pointer->blockSize / DISPLAY_MAX_ONE) > line_number)
688
+
689
+ {
690
+
691
+ //行番号の表示
692
+
693
+ printf(" %05X ", line_number);
694
+
695
+
696
+
697
+ //16個出力するまでループ
698
+
699
+ for (output = 0; DISPLAY_MAX_ONE > output; output++)
700
+
701
+ {
702
+
703
+ //freadの戻り値が出力数より大きいとき
704
+
705
+ if (pointer->contents > output)
706
+
707
+ {
708
+
709
+ //8個目と9個目の間に"-"表示
710
+
711
+ if (output == 7)
712
+
713
+ {
714
+
715
+ printf("%02X-", pointer->data[output]);
716
+
717
+ }
718
+
719
+ else
720
+
721
+ {
722
+
723
+ printf("%02X ", pointer->data[output]);
724
+
725
+ }
726
+
727
+ }
728
+
729
+ else
730
+
731
+ {
732
+
733
+ printf(" ");
734
+
735
+ }
736
+
737
+ }
738
+
739
+
740
+
741
+ //16文字出力するまでループ
742
+
743
+ for (output = 0; DISPLAY_MAX_ONE > output; output++)
744
+
745
+ {
746
+
747
+ //freadの戻り値が出力数より大きいとき
748
+
749
+ if (pointer->contents > output)
750
+
751
+ {
752
+
753
+ key = pointer->data[output];
754
+
755
+
756
+
757
+ //漢字表示ONの時(SHIFT-JIS)
758
+
759
+ if (pointer->chinese_characters == 1)
760
+
761
+ {
762
+
763
+ //全角文字の1byte目の時
764
+
765
+ if ((key >= 0x81 && key <= 0x9f) || (key >= 0xe0 && key <= 0xfc))
766
+
767
+ {
768
+
769
+ //出力文字数が16の時
770
+
771
+ if (output == 15)
772
+
773
+ {
774
+
775
+ putchar('$');
776
+
777
+ character_flag = RET_OK;//文字フラグを1にする
778
+
779
+ }
780
+
781
+ else
782
+
783
+ {
784
+
785
+ putchar(key);
786
+
787
+ }
788
+
789
+ }
790
+
791
+ else
792
+
793
+ {
794
+
795
+ //文字フラグが1の時
796
+
797
+ if (character_flag == RET_OK)
798
+
799
+ {
800
+
801
+ putchar('$');
802
+
803
+ character_flag = 0;//文字フラグを0にする
804
+
805
+ }
806
+
807
+ //半角文字の時
808
+
809
+ else if ((key >= 0x20) && (key <= 0x7e))
810
+
811
+ {
812
+
813
+ putchar(key);
814
+
815
+ }
816
+
817
+ //全角文字、半角文字でもない場合
818
+
819
+ else
820
+
821
+ {
822
+
823
+ putchar('$');
824
+
825
+ }
826
+
827
+ }
828
+
829
+ }
830
+
831
+ //漢字表示OFFの時(ASCII)
832
+
833
+ else
834
+
835
+ {
836
+
837
+ //半角文字の時
838
+
839
+ if ((key >= 0x20) && (key <= 0x7e))
840
+
841
+ {
842
+
843
+ putchar(key);
844
+
845
+ }
846
+
847
+ else
848
+
849
+ {
850
+
851
+ putchar('$');
852
+
853
+ }
854
+
855
+ }
856
+
857
+ }
858
+
859
+ else
860
+
861
+ {
862
+
863
+ putchar(' ');
864
+
865
+ }
866
+
867
+ }
868
+
869
+
870
+
871
+ line_number++;//行番号のカウントアップ
872
+
873
+ printf("\n");
874
+
875
+
876
+
877
+ //4行出力ごとに改行
878
+
879
+ if ((line_number % 4) == 0)
880
+
881
+ {
882
+
883
+ printf("\n");
884
+
885
+ }
886
+
887
+ }
888
+
889
+ }
18
890
 
19
891
  ```
20
892
 
21
- 同じ16個がループしてしまっている
893
+
894
+
895
+
22
896
 
23
897
  ```
24
898
 
25
899
 
26
900
 
27
- ###該当のソースコード
28
-
29
- ```C言語
30
-
31
- ```ここに言語を入力
32
-
33
- #include <stdio.h>
34
-
35
- #include <conio.h>
36
-
37
- #include <stdlib.h>
38
-
39
- #include <string.h>
40
-
41
- #include <math.h>
42
-
43
-
44
-
45
- #define RET_OK 1 //判定フラグ
46
-
47
- #define RET_ESC 0 //ESCキー判定
48
-
49
- #define DISPLAY_MAX_ONE 16 //表示フォーマット1の出力最大桁数
50
-
51
- #define DISPLAY_MAX_TWO 64 //表示フォーマット2の出力最大桁数
52
-
53
- #define MAX 256 //最大文字数
54
-
55
-
56
-
57
- typedef struct _DumpData{
58
-
59
- unsigned char fileName[MAX]; //ファイル名
60
-
61
- unsigned char data[10000]; //読み込んだデータ
62
-
63
- long size; //ファイル容量
64
-
65
- int contents; //freadの戻り値
66
-
67
- int blockSize; //ブロックサイズ
68
-
69
- int totalBlock; //総ブロック数
70
-
71
- FILE* file_pointer; //ファイルポインタ
72
-
73
- int format; //表示フォーマット
74
-
75
- int chinese_characters; //漢字表示
76
-
77
- int blockNumber; //現在のブロック番号
78
-
79
- unsigned char errorField[40]; //エラー表示フィールド
80
-
81
- } DumpData;
82
-
83
-
84
-
85
- //関数プロトタイプ宣言
86
-
87
- //ファイル名入力関数
88
-
89
- short file_name(DumpData* pointer);
90
-
91
-
92
-
93
- //ブロックサイズ入力関数
94
-
95
- short block_size(DumpData* pointer);
96
-
97
-
98
-
99
- //総ブロック数算出関数
100
-
101
- void totalBlock_calculation(DumpData* pointer);
102
-
103
-
104
-
105
- //ファイル要素表示関数
106
-
107
- void file_element(DumpData* pointer);
108
-
109
-
110
-
111
- //ファイルを読み取る関数
112
-
113
- void file_read(DumpData* pointer);
114
-
115
-
116
-
117
- //表示ファイル形式1関数
118
-
119
- void file_display_one(DumpData* pointer);
120
-
121
-
122
-
123
- //メイン関数
124
-
125
- int main(void)
126
-
127
- {
128
-
129
- short ret;
130
-
131
- char key_data;
132
-
133
-
134
-
135
- //構造体DATEの初期化
136
-
137
- DumpData DATA =
138
-
139
- {
140
-
141
- {'\0'}, //ファイル名
142
-
143
- {'\0'}, //読み込んだデータ
144
-
145
- {0}, //ファイル容量
146
-
147
- {0}, //freadの戻り値
148
-
149
- {0}, //ブロックサイズ
150
-
151
- {0}, //総ブロック数
152
-
153
- {'\0'}, //ファイルポインタ
154
-
155
- {1}, //表示フォーマット
156
-
157
- {0}, //漢字表示
158
-
159
- {1}, //現在のブロック番号
160
-
161
- {'\0'}, //エラー表示フィールド
162
-
163
- };
164
-
165
-
166
-
167
- DumpData* data;//構造体のポインタ宣言
168
-
169
- data = &DATA;//ポインタdataに構造体DATEの先頭アドレスを代入
170
-
171
-
172
-
173
- printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
174
-
175
- printf("* * * * * * * *\n");
176
-
177
- printf("* * * * * * * *\n");
178
-
179
- printf("* * * * ファイルダンプ Ver 1.00 * * * *\n");
180
-
181
- printf("* * * * * * * *\n");
182
-
183
- printf("* * * * * * * *\n");
184
-
185
- printf("* * * * * * * *\n");
186
-
187
- printf("* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
188
-
189
-
190
-
191
- //ファイル名入力関数の呼び出し
192
-
193
- ret = file_name(data);
194
-
195
- if (ret != RET_OK)
196
-
197
- {
198
-
199
- return 0;//プログラムを終了
200
-
201
- }
202
-
203
-
204
-
205
- //ブロックサイズ入力関数の呼び出し
206
-
207
- ret = block_size(data);
208
-
209
- if (ret != RET_OK)
210
-
211
- {
212
-
213
- return 0;//プログラムを終了
214
-
215
- }
216
-
217
-
218
-
219
- //総ブロック数算出関数の呼び出し
220
-
221
- totalBlock_calculation(data);
222
-
223
-
224
-
225
-
226
-
227
- file_element(data);//ファイル要素表示関数の呼び出し
228
-
229
-
230
-
231
- file_read(data);//ファイル読み込み関数の呼び出し
232
-
233
-
234
-
235
- file_display_one(data);
236
-
237
-
238
-
239
- }
240
-
241
-
242
-
243
- //ファイル名入力関数
244
-
245
- short file_name(DumpData* pointer)
246
-
247
- {
248
-
249
- char key;
250
-
251
- short judgment_flag;//判定フラグ
252
-
253
- long character_number;//文字数
254
-
255
-
256
-
257
- // ファイルを開くか、ESCキーが入力されるまで
258
-
259
- judgment_flag = RET_OK;
260
-
261
- pointer->file_pointer = NULL;
262
-
263
- while ((pointer->file_pointer == NULL) &&
264
-
265
- (judgment_flag == RET_OK))
266
-
267
- {
268
-
269
- printf("\n ファイル名を入力してください\n>");
270
-
271
-
272
-
273
- //文字数が256文字以下の間
274
-
275
- for (character_number = 0; character_number < 255; character_number++)
276
-
277
- {
278
-
279
- key = (char)_getch();
280
-
281
-
282
-
283
- //ESCキーを押下した時
284
-
285
- if (key == 0x1b)
286
-
287
- {
288
-
289
- judgment_flag = RET_ESC;//判定フラグを0にする
290
-
291
- break;
292
-
293
- }
294
-
295
-
296
-
297
- //エンターキーを押下した時
298
-
299
- if (key == 0x0d)
300
-
301
- {
302
-
303
- break;//入力終了
304
-
305
- }
306
-
307
-
308
-
309
- //いずれのキーも押下していないとき
310
-
311
- putchar(key);//1文字ずつ出力
312
-
313
- pointer->fileName[character_number] = key;//出力した文字を1文字ずつ構造体のファイル名に格納
314
-
315
- }
316
-
317
-
318
-
319
- // ファイル名が入力された場合(=Escキーが押されなかった場合)
320
-
321
- if (judgment_flag == RET_OK)
322
-
323
- {
324
-
325
- pointer->fileName[character_number] = '\0';//ファイル名の最後にヌルを入れる
326
-
327
-
328
-
329
- // ファイルを開く
330
-
331
- pointer->file_pointer = fopen((char*)&pointer->fileName[0], "rb");
332
-
333
-
334
-
335
- // ファイルが開けなかった場合
336
-
337
- if (pointer->file_pointer == NULL)
338
-
339
- {
340
-
341
- printf("\n<<ファイルが見つかりません>>");
342
-
343
- }
344
-
345
- }
346
-
347
- }
348
-
349
-
350
-
351
- return judgment_flag;//判定フラグを返す
352
-
353
- }
354
-
355
-
356
-
357
- //ブロックサイズ入力関数
358
-
359
- short block_size(DumpData* pointer)
360
-
361
- {
362
-
363
- short judgment_flag;//判定フラグ
364
-
365
- char key;
366
-
367
-
368
-
369
- // ブロックサイズを指定するか、ESCキーが入力されるまで
370
-
371
- pointer->blockSize = 0;
372
-
373
- judgment_flag = RET_OK;
374
-
375
- while ((pointer->blockSize == 0) &&
376
-
377
- (judgment_flag == RET_OK))
378
-
379
- {
380
-
381
- printf("\n ブロックサイズを指定してください\n");
382
-
383
- printf(" ( (1)64 (2)128 (3)256 ) >");
384
-
385
- key = (char)_getch();
386
-
387
-
388
-
389
- //ESCキーが押下された場合
390
-
391
- if (key == 0x1b)
392
-
393
- {
394
-
395
- judgment_flag = RET_ESC;//判定フラグを0にする
396
-
397
- break;
398
-
399
- }
400
-
401
-
402
-
403
- putchar(key);
404
-
405
-
406
-
407
- switch (key)
408
-
409
- {
410
-
411
- //入力した数が1の場合
412
-
413
- case '1':
414
-
415
- pointer->blockSize = 64;//構造体のブロックサイズに格納
416
-
417
- break;
418
-
419
-
420
-
421
- //入力した数が2の場合
422
-
423
- case '2':
424
-
425
- pointer->blockSize = 128;//構造体のブロックサイズに格納
426
-
427
- break;
428
-
429
-
430
-
431
- //入力した数が3の場合
432
-
433
- case '3':
434
-
435
- pointer->blockSize = 256;//構造体のブロックサイズに格納
436
-
437
- break;
438
-
439
-
440
-
441
- //1,2,3,ESCキーのいずれでも無い場合
442
-
443
- default:
444
-
445
- printf("\n<<該当する項目がありません>>");
446
-
447
- break;
448
-
449
- }
450
-
451
- }
452
-
453
-
454
-
455
- return judgment_flag;//判定フラグを返す
456
-
457
- }
458
-
459
-
460
-
461
- //総ブロック数算出関数
462
-
463
- void totalBlock_calculation(DumpData* pointer)
464
-
465
- {
466
-
467
- double calculation;//計算結果
468
-
469
- double check;
470
-
471
- int location = 0;
472
-
473
-
474
-
475
- //ファイルの最後までシーク
476
-
477
- location = fseek(pointer->file_pointer, 0, SEEK_END);
478
-
479
-
480
-
481
- //fseekのエラー検査
482
-
483
- if (location != 0)
484
-
485
- {
486
-
487
- strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
488
-
489
- }
490
-
491
- else
492
-
493
- {
494
-
495
- //ファイルの容量を取得する
496
-
497
- pointer->size = ftell(pointer->file_pointer);
498
-
499
-
500
-
501
- //総ブロック数の計算
502
-
503
- calculation = (double)pointer->size / (double)pointer->blockSize;
504
-
505
-
506
-
507
- //小数点以下を切り上げる
508
-
509
- check = ceil(calculation);
510
-
511
-
512
-
513
- pointer->totalBlock = (int)check;//構造体の総ブロック数に格納
514
-
515
- }
516
-
517
- }
518
-
519
-
520
-
521
- //ファイル要素表示関数
522
-
523
- void file_element(DumpData* pointer)
524
-
525
- {
526
-
527
- printf("\n\n ファイル名:%s", pointer->fileName);
528
-
529
- printf(" 総ブロック数:%d", pointer->totalBlock);
530
-
531
- printf(" ブロックサイズ:%d\n", pointer->blockSize);
532
-
533
-
534
-
535
- //フォーマットが1の時
536
-
537
- if (pointer->format == 1)
538
-
539
- {
540
-
541
- printf("\n 表示フォーマット1");
542
-
543
- }
544
-
545
- //フォーマットが2の時
546
-
547
- else
548
-
549
- {
550
-
551
- printf("\n 表示フォーマット2");
552
-
553
- }
554
-
555
-
556
-
557
- //漢字表示が0の時
558
-
559
- if (pointer->chinese_characters == 0)
560
-
561
- {
562
-
563
- printf(" 漢字表示OFF\n");
564
-
565
- }
566
-
567
- //漢字表示が1の時
568
-
569
- else
570
-
571
- {
572
-
573
- printf(" 漢字表示ON\n");
574
-
575
- }
576
-
577
-
578
-
579
- printf(" ブロック番号:%d", pointer->blockNumber);
580
-
581
- printf(" [%-40s ]\n", pointer->errorField);
582
-
583
- }
584
-
585
-
586
-
587
- //ファイルを読み取る関数
588
-
589
- void file_read(DumpData* pointer)
590
-
591
- {
592
-
593
- int location = 0;
594
-
595
-
596
-
597
- //先頭ページのとき
598
-
599
- if (pointer->blockNumber == 1)
600
-
601
- {
602
-
603
- location = fseek(pointer->file_pointer, 0, SEEK_SET);
604
-
605
- }
606
-
607
-
608
-
609
- //fseekのエラー検査
610
-
611
- if (location != 0)
612
-
613
- {
614
-
615
- strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
616
-
617
- }
618
-
619
- else
620
-
621
- {
622
-
623
- pointer->contents = fread(pointer->data, sizeof(unsigned char), pointer->size, pointer->file_pointer);
624
-
625
-
626
-
627
- //freadの戻り値が要素数より少ない時
628
-
629
- if (pointer->blockSize > pointer->contents)
630
-
631
- {
632
-
633
- //feofの戻り値が0以外のときエラー
634
-
635
- if (feof(pointer->file_pointer) != 0)
636
-
637
- {
638
-
639
- strcpy((char*)&pointer->errorField[0], "ファイルリードエラー");//構造体のエラー表示フィールドに格納
640
-
641
- }
642
-
643
- else
644
-
645
- {
646
-
647
- strcpy((char*)&pointer->errorField[0], "");//構造体のエラー表示フィールドに格納
648
-
649
- }
650
-
651
- }
652
-
653
- else
654
-
655
- {
656
-
657
- strcpy((char*)&pointer->errorField[0], "");//構造体のエラー表示フィールドに格納
658
-
659
- }
660
-
661
- }
662
-
663
- }
664
-
665
-
666
-
667
- //表示ファイル形式1関数
668
-
669
- void file_display_one(DumpData* pointer)
670
-
671
- {
672
-
673
- int key;
674
-
675
- int output;//出力桁数
676
-
677
- int line_number;//行番号
678
-
679
- short character_flag = 0;//文字フラグ
680
-
681
-
682
-
683
- printf(" Addr Hex ASCII\n");
684
-
685
-
686
-
687
- //選択したブロックサイズ÷16した数が行番号より大きい間繰り返し
688
-
689
- line_number = 0;
690
-
691
- while ((pointer->blockSize / DISPLAY_MAX_ONE) > line_number)
692
-
693
- {
694
-
695
- //行番号の表示
696
-
697
- printf(" %05X ", line_number);
698
-
699
-
700
-
701
- //16個出力するまでループ
702
-
703
- for (output = 0; DISPLAY_MAX_ONE > output; output++)
704
-
705
- {
706
-
707
- //freadの戻り値が出力数より大きいとき
708
-
709
- if (pointer->contents > output)
710
-
711
- {
712
-
713
- //8個目と9個目の間に"-"表示
714
-
715
- if (output == 7)
716
-
717
- {
718
-
719
- printf("%02X-", pointer->data[output]);
720
-
721
- }
722
-
723
- else
724
-
725
- {
726
-
727
- printf("%02X ", pointer->data[output]);
728
-
729
- }
730
-
731
- }
732
-
733
- else
734
-
735
- {
736
-
737
- printf(" ");
738
-
739
- }
740
-
741
- }
742
-
743
-
744
-
745
- //16文字出力するまでループ
746
-
747
- for (output = 0; DISPLAY_MAX_ONE > output; output++)
748
-
749
- {
750
-
751
- //freadの戻り値が出力数より大きいとき
752
-
753
- if (pointer->contents > output)
754
-
755
- {
756
-
757
- key = pointer->data[output];
758
-
759
-
760
-
761
- //漢字表示ONの時(SHIFT-JIS)
762
-
763
- if (pointer->chinese_characters == 1)
764
-
765
- {
766
-
767
- //全角文字の1byte目の時
768
-
769
- if ((key >= 0x81 && key <= 0x9f) || (key >= 0xe0 && key <= 0xfc))
770
-
771
- {
772
-
773
- //出力文字数が16の時
774
-
775
- if (output == 15)
776
-
777
- {
778
-
779
- putchar('$');
780
-
781
- character_flag = RET_OK;//文字フラグを1にする
782
-
783
- }
784
-
785
- else
786
-
787
- {
788
-
789
- putchar(key);
790
-
791
- }
792
-
793
- }
794
-
795
- else
796
-
797
- {
798
-
799
- //文字フラグが1の時
800
-
801
- if (character_flag == RET_OK)
802
-
803
- {
804
-
805
- putchar('$');
806
-
807
- character_flag = 0;//文字フラグを0にする
808
-
809
- }
810
-
811
- //半角文字の時
812
-
813
- else if ((key >= 0x20) && (key <= 0x7e))
814
-
815
- {
816
-
817
- putchar(key);
818
-
819
- }
820
-
821
- //全角文字、半角文字でもない場合
822
-
823
- else
824
-
825
- {
826
-
827
- putchar('$');
828
-
829
- }
830
-
831
- }
832
-
833
- }
834
-
835
- //漢字表示OFFの時(ASCII)
836
-
837
- else
838
-
839
- {
840
-
841
- //半角文字の時
842
-
843
- if ((key >= 0x20) && (key <= 0x7e))
844
-
845
- {
846
-
847
- putchar(key);
848
-
849
- }
850
-
851
- else
852
-
853
- {
854
-
855
- putchar('$');
856
-
857
- }
858
-
859
- }
860
-
861
- }
862
-
863
- else
864
-
865
- {
866
-
867
- putchar(' ');
868
-
869
- }
870
-
871
- }
872
-
873
-
874
-
875
- line_number++;//行番号のカウントアップ
876
-
877
- printf("\n");
878
-
879
-
880
-
881
- //4行出力ごとに改行
882
-
883
- if ((line_number % 4) == 0)
884
-
885
- {
886
-
887
- printf("\n");
888
-
889
- }
890
-
891
- }
892
-
893
- }
894
-
895
- ```
896
-
897
-
898
-
899
-
900
-
901
- ```
902
-
903
-
904
-
905
901
  ###試したこと
906
902
 
907
903
  最初はファイルの内容を表示する関数内のwhileループの中で16個ずつfreadしていけば出来ると考え、出来たのですがこれだと読み込みの途中でエラーでた場合がダメだと言われ、質問の内容に切り替えた次第です。

1

ソースコードのインデントをしました。

2017/08/03 02:56

投稿

hinatti
hinatti

スコア14

test CHANGED
File without changes
test CHANGED
@@ -28,6 +28,8 @@
28
28
 
29
29
  ```C言語
30
30
 
31
+ ```ここに言語を入力
32
+
31
33
  #include <stdio.h>
32
34
 
33
35
  #include <conio.h>
@@ -886,18 +888,20 @@
886
888
 
887
889
  }
888
890
 
889
- }
891
+ }
890
892
 
891
893
  }
892
894
 
893
-
894
-
895
-
896
-
897
895
  ```
898
896
 
899
897
 
900
898
 
899
+
900
+
901
+ ```
902
+
903
+
904
+
901
905
  ###試したこと
902
906
 
903
907
  最初はファイルの内容を表示する関数内のwhileループの中で16個ずつfreadしていけば出来ると考え、出来たのですがこれだと読み込みの途中でエラーでた場合がダメだと言われ、質問の内容に切り替えた次第です。