質問編集履歴

1

コードの追加

2020/07/01 05:19

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -31,3 +31,287 @@
31
31
  上記の方の質問を見ての質問です。
32
32
 
33
33
  よろしくお願い致します。
34
+
35
+ ```C
36
+
37
+ #include <stdio.h>
38
+
39
+ #include <stdlib.h>
40
+
41
+ #pragma warning(disable: 4996)
42
+
43
+
44
+
45
+ #define H_PRT 0x02// ヘッダ印字オプション
46
+
47
+ #define C_PRT 0x01// 文字印字オプション
48
+
49
+ #define ROW 16 // 1行に表示する文字
50
+
51
+ #define TESTBUF 512 //テストデータ用のバッファ
52
+
53
+ #define TEXTBUF 1024 //テキストファイル用のバッファ
54
+
55
+
56
+
57
+ //プロトタイプ宣言
58
+
59
+ void dump(char* title, unsigned char* staddr, int offset, int dsize, char opt);
60
+
61
+
62
+
63
+ void main(void) {
64
+
65
+
66
+
67
+ //int filcnt;// フィル用のカウンタ
68
+
69
+
70
+
71
+ //char bin_data[TESTBUF];// テストデータ用のバッファ
72
+
73
+ //char asc_data[] = "01234567809 ABCあいうえおかきくけこDEFGHIJKLMNOPQRSTUVWXYZ 漢字表示のテスト abcdefghijklmnopqrstuvwxyz01234567809ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz";
74
+
75
+ char txt_data[TEXTBUF]; // テキストファイル読み込み用
76
+
77
+ //char txt;
78
+
79
+ int readnum;
80
+
81
+
82
+
83
+ FILE* file;
84
+
85
+ file = fopen("s-jis2.txt", "rb");
86
+
87
+ if (file == NULL) {
88
+
89
+ printf("ファイルが開けません");
90
+
91
+ exit(1);
92
+
93
+ }
94
+
95
+
96
+
97
+ readnum = fread(txt_data, sizeof(unsigned char), TEXTBUF, file);
98
+
99
+
100
+
101
+ if (readnum == 0) {
102
+
103
+
104
+
105
+ printf("ファイルの内容がありません");
106
+
107
+ exit(1);
108
+
109
+ }
110
+
111
+
112
+
113
+ fclose(file);
114
+
115
+
116
+
117
+ //for (filcnt = 0; filcnt < 512; filcnt++) bin_data[filcnt] = filcnt & 0xff; // テスト用のテーブルを0からFFで埋める
118
+
119
+
120
+
121
+ // dump("\nASCIIdata 文字印字あり", asc_data, 0, 65, H_PRT + C_PRT);
122
+
123
+ // dump("\nBINARYdata 文字印字あり", bin_data, 0, 512, H_PRT + C_PRT);
124
+
125
+ dump("テキストファイル", txt_data, 0, readnum, H_PRT + C_PRT);
126
+
127
+ }
128
+
129
+
130
+
131
+
132
+
133
+ void dump(char* title, unsigned char* staddr, int offset, int dsize, char opt) {
134
+
135
+
136
+
137
+ int startcnt = 0;// ダンプするバイト数のカウント
138
+
139
+ int bytecnt; // 16回ループさせる
140
+
141
+ int savecnt = 0;
142
+
143
+ int address = 0; //アドレスの表示
144
+
145
+ int onhold = 0; //文字出力が最後のバイトだった時の一時保留
146
+
147
+ staddr += offset;
148
+
149
+
150
+
151
+ char addrhead[] = "Addr";
152
+
153
+ char hexa[] = "0 1 2 3 4 5 6 7 8 9 A B C D E F";
154
+
155
+ char charprint[] = "0 2 4 6 8 A C E";
156
+
157
+
158
+
159
+
160
+
161
+ printf("\n%s\n", title);
162
+
163
+ printf(" %s %s %s\n", addrhead, hexa, charprint);
164
+
165
+
166
+
167
+ printf("-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------\n");
168
+
169
+
170
+
171
+ while (startcnt < dsize) {
172
+
173
+
174
+
175
+ if (onhold != 0) { //前回最後が漢字だった場合、漢字を出力して改行
176
+
177
+
178
+
179
+ printf("%c%c", onhold, staddr[startcnt]);
180
+
181
+ printf("\n");
182
+
183
+ }
184
+
185
+
186
+
187
+ printf("%08x ", address);
188
+
189
+
190
+
191
+ savecnt = startcnt;
192
+
193
+ for (bytecnt = 0; bytecnt < ROW; bytecnt++) {
194
+
195
+
196
+
197
+ if (startcnt < dsize) {
198
+
199
+ printf("%02x", staddr[startcnt]); //16進数で出力
200
+
201
+ }
202
+
203
+ else {
204
+
205
+ printf(" ");
206
+
207
+ }
208
+
209
+ if (startcnt % 2 != 0) {
210
+
211
+ printf(" ");
212
+
213
+ }
214
+
215
+ startcnt++;
216
+
217
+ }
218
+
219
+ startcnt = savecnt;
220
+
221
+
222
+
223
+ //文字の出力
224
+
225
+ for (bytecnt = 0; bytecnt < ROW; bytecnt++) {
226
+
227
+
228
+
229
+ if (onhold != 0) { //前回最後が漢字だった場合 次の行の最初にスペースと初期化
230
+
231
+
232
+
233
+ printf(" ");
234
+
235
+ onhold = 0;
236
+
237
+ bytecnt++;
238
+
239
+ }
240
+
241
+
242
+
243
+ //漢字だった場合
244
+
245
+ if ((staddr[startcnt] >= 0x81 && staddr[startcnt] < 0xa0) || (staddr[startcnt] >= 0xe0 && staddr[startcnt] < 0xfd)) {
246
+
247
+
248
+
249
+ if (bytecnt > ROW - 1) { //漢字で最後のバイトの場合、保留
250
+
251
+
252
+
253
+ onhold = staddr[startcnt];
254
+
255
+ bytecnt++;
256
+
257
+
258
+
259
+ }
260
+
261
+ else {//最後のバイトでなければ出力
262
+
263
+
264
+
265
+ printf("%c%c", staddr[startcnt], staddr[startcnt + 1]);
266
+
267
+ startcnt++;
268
+
269
+ bytecnt++;
270
+
271
+ }
272
+
273
+ }
274
+
275
+ if (startcnt < dsize) {
276
+
277
+
278
+
279
+ if ((staddr[startcnt] >= 0x20 && staddr[startcnt] < 0x7f) || (staddr[startcnt] >= 0xa0 && staddr[startcnt] < 0xe0)) {
280
+
281
+
282
+
283
+ printf("%c", staddr[startcnt]);
284
+
285
+ }
286
+
287
+
288
+
289
+ }
290
+
291
+ else {
292
+
293
+
294
+
295
+ printf(" ");
296
+
297
+ }
298
+
299
+ startcnt++;
300
+
301
+ }
302
+
303
+ if (onhold == 0) { //最後が漢字でなければ改行
304
+
305
+ printf("\n");
306
+
307
+ }
308
+
309
+ address += ROW; //addressを出力しただけ足す
310
+
311
+
312
+
313
+ }
314
+
315
+ }
316
+
317
+ ```