質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

1164閲覧

C言語 ダンプ出力したい

kokok

総合スコア145

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2019/08/08 00:09

編集2019/08/08 00:41

c

1 2#include <stdio.h> 3#include <stdlib.h> 4#pragma warning(disable: 4996) 5 6#define H_PRT 0x02// ヘッダ印字オプション 7#define C_PRT 0x01// 文字印字オプション 8#define ROW 16 // 1行に表示する文字 9#define TESTBUF 512 //テストデータ用のバッファ 10#define TEXTBUF 1024 //テキストファイル用のバッファ 11 12//プロトタイプ宣言 13void dump(char* title, unsigned char* staddr, int offset, int dsize, char opt); 14 15void main(void) { 16 17 //int filcnt;// フィル用のカウンタ 18 19 //char bin_data[TESTBUF];// テストデータ用のバッファ 20 //char asc_data[] = "01234567809 ABCあいうえおかきくけこDEFGHIJKLMNOPQRSTUVWXYZ 漢字表示のテスト abcdefghijklmnopqrstuvwxyz01234567809ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz"; 21 char txt_data[TEXTBUF]; // テキストファイル読み込み用 22 //char txt; 23 int readnum; 24 25 FILE* file; 26 file = fopen("s-jis2.txt", "rb"); 27 if (file == NULL) { 28 printf("ファイルが開けません"); 29 exit(1); 30 } 31 32 readnum = fread(txt_data, sizeof(unsigned char), TEXTBUF, file); 33 34 if (readnum == 0) { 35 36 printf("ファイルの内容がありません"); 37 exit(1); 38 } 39 40 fclose(file); 41 42 //for (filcnt = 0; filcnt < 512; filcnt++) bin_data[filcnt] = filcnt & 0xff; // テスト用のテーブルを0からFFで埋める 43 44// dump("\nASCIIdata 文字印字あり", asc_data, 0, 65, H_PRT + C_PRT); 45// dump("\nBINARYdata 文字印字あり", bin_data, 0, 512, H_PRT + C_PRT); 46 dump("テキストファイル", txt_data, 0, readnum, H_PRT + C_PRT); 47} 48 49 50void dump(char* title, unsigned char* staddr, int offset, int dsize, char opt) { 51 52 int startcnt = 0;// ダンプするバイト数のカウント 53 int bytecnt; // 16回ループさせる 54 int savecnt = 0; 55 int address = 0; //アドレスの表示 56 int onhold = 0; //文字出力が最後のバイトだった時の一時保留 57 staddr += offset; 58 59 char addrhead[] = "Addr"; 60 char hexa[] = "0 1 2 3 4 5 6 7 8 9 A B C D E F"; 61 char charprint[] = "0 2 4 6 8 A C E"; 62 63 64 printf("\n%s\n", title); 65 printf(" %s %s %s\n", addrhead, hexa, charprint); 66 67 printf("-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------\n"); 68 69 while (startcnt < dsize) { 70 71 if (onhold != 0) { //前回最後が漢字だった場合、漢字を出力して改行 72 73 printf("%c%c", onhold, staddr[startcnt]); 74 printf("\n"); 75 } 76 77 printf("%08x ", address); 78 79 savecnt = startcnt; 80 for (bytecnt = 0; bytecnt < ROW; bytecnt++) { 81 82 if (startcnt < dsize) { 83 printf("%02x", staddr[startcnt]); //16進数で出力 84 } 85 else { 86 printf(" "); 87 } 88 if (startcnt % 2 != 0) { 89 printf(" "); 90 } 91 startcnt++; 92 } 93 startcnt = savecnt; 94 95 //文字の出力 96 for (bytecnt = 0; bytecnt < ROW; bytecnt++) { 97 98 if (onhold != 0) { //前回最後が漢字だった場合 次の行の最初にスペースと初期化 99 100 printf(" "); 101 onhold = 0; 102 bytecnt++; 103 } 104 105 //漢字だった場合 106 if ((staddr[startcnt] >= 0x81 && staddr[startcnt] < 0xa0) || (staddr[startcnt] >= 0xe0 && staddr[startcnt] < 0xfd)) { 107 108 if (bytecnt > ROW - 1) { //漢字で最後のバイトの場合、保留 109 110 onhold = staddr[startcnt]; 111 bytecnt++; 112 113 } 114 else {//最後のバイトでなければ出力 115 116 printf("%c%c", staddr[startcnt], staddr[startcnt + 1]); 117 startcnt++; 118 bytecnt++; 119 } 120 } 121 if (startcnt < dsize) { 122 123 if ((staddr[startcnt] >= 0x20 && staddr[startcnt] < 0x7f) || (staddr[startcnt] >= 0xa0 && staddr[startcnt] < 0xe0)) { 124 125 printf("%c", staddr[startcnt]); 126 } 127 128 } 129 else { 130 131 printf(" "); 132 } 133 startcnt++; 134 } 135 if (onhold == 0) { //最後が漢字でなければ改行 136 printf("\n"); 137 } 138 address += ROW; //addressを出力しただけ足す 139 140 } 141}

上記のコードを実行すると

テキストファイル                     文字出力
Addr 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 2 4 6 8 A C E


00000000 8e84 82bd 82bf 4a54 4543 2043 6f72 706f 私たスちソJTEC Corpo
00000010 7261 7469 6f6e 2082 cd81 4131 3939 3694 ration はヘ、A1996年N
00000020 38 8c8e 82cc 916e 8bc6 88c8 9788 8141 938月のフ創n業ニ以ネ来、A日
00000030 967b 82aa 8e9d 82c2 8175 8fa0 8176 82cc 本{がェ持つツ「u匠」vのフ
00000040 90b8 905f 82f0 8c70 8fb3 82b5 8141 926d 精ク神_を継p承ウしオ、A知m
00000050 8eaf 82c9 8aee 82c3 82ad 926d 8c62 82f0 識ッにノ基づテくュ知m恵bを
00000060 88b5 82a4 8175 8b5a 8f70 8fa4 8ed0 8176 扱オう、「u技Z術p商、社ミ」v
00000070 82c6 82b5 82c4 8141 91bd 82ad 82cc 82a8 とニしオてト、A多スくュのフおィ
00000080 8ee6 88f8 90e6 82cc 8a46 976c 82c9 8b5a 取引先のフ皆F様lにノ技Z
00000090 8f70 9045 926d 8de0 d8b0 bd90 ea96 e582 術p職E知m財リース専門のフ
000000a0 53 6f6c 7574 696f 6e20 436f 6d70 616e 79Solution Company
000000b0 82 c682 b582 c450 6172 746e 6572 7368 69とニしオてトPartnershi
000000c0 70 82f0 927a 82ab 82c8 82aa 82e7 94ad 93pを築zきォなネがェら発ュ展W
000000d0 82b5 82c4 82dc 82a2 82e8 82dc 82b5 82bd しオてトまワい「りまワしオたス
000000e0 8142 0d0a 93fa 967b 82f0 8ee6 82e8 8aaa 。B日本{を取り巻ェ
000000f0 82ad 8ed0 89ef 8ac2 8bab 82cd 91e5 82ab くュ社ミ会環ツ境ォはヘ大きォ
00000100 82c8 95cf 89bb 82f0 908b 82b0 82e6 82a4 なネ変マ化サを遂げーよう、
00000110 82c6 82b5 82c4 82a2 82dc 82b7 8142 8e84 とニしオてトい「まワすキ。B私
00000120 82c7 82e0 82aa 92bc 90da 8c57 82e9 90bb どヌもがェ直シ接レ係Wる製サ
00000130 91a2 8bc6 82f0 9286 9053 82c6 82b5 82bd 造「業ニを中心Sとニしオたス
00000140 8ae9 8bc6 8d5c 91a2 82e0 82df 82dc 82ae 企業ニ構\造「もめ゚まワぐョ
00000150 82e9 82b5 82ad 95cf 9665 82b5 82c4 82e4 るしオくュ変マ貌eしオてトゆ
00000160 82ad 8ff3 8bb5 89ba 82c9 82a8 82ab 82dc くュ状況オ下コにノおィきォまワ
00000170 82b5 82c4 8141 8d91 93e0 82cd 82e0 82c6 しオてト、A国内はヘもとニ
00000180 82e6 82e8 906c 8de0 97ac 93ae 82cc 8d91 より人l財流ャ動ョのフ国
00000190 8ddb 89bb 82e0 8e8b 96ec 82c9 93fc 82ea 際ロ化サも視野にノ入れ
000001a0 8141 8e84 82bd 82bf 4a54 4543 2043 6f72 、A私たスちソJTEC Cor
000001b0 706f 7261 7469 6f6e 2082 cd8d c58d 8282 poration はヘ最ナ高のフ
000001c0 8b 5a8f 7090 4592 6d8d e083 8a81 5b83 58技Z術p職E知m財リー[スX
000001d0 83 5481 5b83 7283 5882 f082 a282 c282 c5サTー[ビrスXをい「つツでナ
000001e0 82 e081 4189 bd8f 8882 c582 e081 41c0 b2も、A何ス処でナも、Aタイ
000001f0 d1 d8b0 82c9 88c0 9053 82b5 82c4 8a88 97ムリーにノ安タ心Sしオてト活用p
00000200 82a2 82bd 82be 82af 82e9 82e6 82a4 82c9 い「たスだセけッるよう、にノ
00000210 82a2 82bd 82b5 82dc 82b7 8142 0d0a 82bb い「たスしオまワすキ。Bそサ
00000220 82cc 82bd 82df 82c9 82cd 8141 82e6 82e8 のフたスめ゚にノはヘ、Aより
00000230 8d82 9378 82c8 90e6 9069 8b5a 8f70 82c6 高度xなネ先進i技Z術pとニ
00000240 926d 8de0 82f0 8ed0 88f5 82c9 8bb3 88e7 知m財を社ミ員にノ教ウ育
00000250 82b7 82e9 82b1 82c6 82cd 82e0 82c6 82e6 すキるこアとニはヘもとニよ
00000260 82e8 8141 906c 8ad4 90ab 964c 82a9 82c8 り、A人l間ヤ性ォ豊Lかゥなネ
00000270 c3b8 c9db bcde bdc4 82c6 8b5a 8f70 8ed2 テクノロジストとニ技Z術p者メ
00000280 82f0 88e7 90ac 82b5 8141 82a8 8ee6 88f8 を育成ャしオ、Aおィ取引
00000290 90e6 82cc 8a46 976c 82c9 82cd 8dc5 97c7 先のフ皆F様lにノはヘ最ナ良ヌ
000002a0 82cc 5061 7274 6e65 7282 c682 b582 c481 のフPartnerとニしオてト、A
000002b0 8d 9193 e08a 4f82 cc8b a391 8897 cd8c fc国内外Oのフ競」争力ヘ向
000002c0 8f e382 c982 a896 f097 a782 c492 b882 af上にノおィ役立ァてト頂クけッ
000002d0 82 e982 e682 a491 538e d082 aa88 ea8a dbるよう、全S社ミがェ一丸ロ
000002e0 82 c682 c882 e881 4182 c882 a888 ea91 77とニなネり、Aなネおィ一層w
000002f0 8b ad8c c582 c583 7683 8d83 7483 4683 62強ュ固ナでナプvロフtェFッb
00000300 83 5683 8783 6983 8b82 c883 6583 4e83 6dシVョナiルなネテeクNノm
00000310 83 8d83 5783 5883 6782 c68b 5a8f 708e d2ロジWスXトgとニ技Z術p者メ
00000320 8f 5792 638d ec82 e882 c98e e682 e891 67集W団c作りにノ取り組g
00000330 82 f182 c582 dc82 a282 e882 dc82 b781 42んでナまワい「りまワすキ。B
00000340 0d 0a8d a18c e382 c682 e043 6f6d 706c 69今。後とニもCompli
00000350 61 6e63 6582 f08f 858e e782 b581 4182 a8anceを遵守しオ、Aおィ
00000360 8b 7197 6c82 c98d 8293 7882 c853 6572 76客q様lにノ高度xなネServ
00000370 69 6365 82f0 92f1 8b9f 82c5 82ab 82e9 82iceを提供でナきォるよ
00000380 82a4 9377 97cd 82b5 82dc 82b7 82cc 82c5 う、努w力ヘしオまワすキのフでナ
00000390 8141 8a46 976c 82cc 89b7 82a9 82ad 82b2 、A皆F様lのフ温キかゥくュごイ
000003a0 979d 89f0 82cc 82a0 82e9 82b2 8e78 8987 理解のフあるごイ支x援
000003b0 82f0 8e92 82e8 82dc 82b7 976c 8141 82e6 を賜りまワすキ様l、Aよ
000003c0 82eb 82b5 82ad 82a8 8ae8 82a2 905c 82b5 ろしオくュおィ願い「申\しオ
000003d0 8fe3 82b0 82dc 82b7 8142 0d0a 上げーまワすキ。B


となります。

やりたいこと(改善したいこと)
・文字をしっかりとヘッダーに揃えたい( Addr 部分のように 一バイトずつ綺麗に揃えたい)
・文字出力で最後の行が漢字なら 一度保留して  出力して  次の行の最初にスペースを入れる
(漢字が最後のバイトだった場合、2バイトないと出力できないため、一旦保留して 出力して次の行の最初にスペースを入れたい)

・文字出力は出来ているのですが、変な文字が紛れているので直したい

この三点が解決できなかったのでアドバイス頂けると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2019/08/08 00:13

> ・文字をしっかりとヘッダーに揃えたい 具体的にどういうことでしょうか? > ・文字出力で最後の行が漢字なら 一度保留して  出力して  次の行の最初にスペースを入れる それを自分でするために、何がわかりませんか? また、「一度保留して 出力して」とは具体的にどういうことでしょうか?
otn

2019/08/08 01:13

文字出力で行の最後のバイトが漢字1バイト目なら 次の行頭の1バイトとあわせて漢字1文字にして出力して、次の行の最初にスペースを入れる ということですかね?
kokok

2019/08/08 01:53

はい、そうです。
guest

回答2

0

ベストアンサー

こんなのはいかがでしょうか?

C

1#include <stdio.h> 2#include <ctype.h> // isprint 3#pragma warning(disable: 4996) 4 5#define H_PRT 0x02// ヘッダ印字オプション 6#define C_PRT 0x01// 文字印字オプション 7#define ROW 16 // 1行に表示する文字 8#define TESTBUF 512 //テストデータ用のバッファ 9#define TEXTBUF 1024 //テキストファイル用のバッファ 10 11//プロトタイプ宣言 12void dump(const char* title, const char* addr, int offset, int dsize, char opt); 13 14int main(void) 15{ 16 FILE* file = fopen("s-jis2.txt", "rb"); 17 if (file == NULL) { printf("ファイルが開けません"); return 1; } 18 19 char txt_data[TEXTBUF]; // テキストファイル読み込み用 20 int readnum = fread(txt_data, sizeof(unsigned char), TEXTBUF, file); 21 if (readnum == 0) { printf("ファイルの内容がありません"); return 1; } 22 fclose(file); 23 24 dump("テキストファイル", txt_data, 0, readnum, H_PRT + C_PRT); 25} 26 27int iskanji(unsigned char c) { return (c ^ 0x20) - 0xa1 < 60u; } 28int iskanji2(unsigned char c) { return c >= 0x40 && c <= 0xfd && c != 0x7f; } 29int iskana(unsigned char c) { return c >= 0xa1 && c <= 0xdf; } 30 31void dump(const char* title, const char* addr, int offset, int dsize, char opt) { 32 33 unsigned char *staddr = (unsigned char *)addr; 34 int startcnt = 0; // ダンプするバイト数のカウント 35 int bytecnt; // 16回ループさせる 36 int savecnt = 0; 37 int address = 0; // アドレスの表示 38 int onhold = 0; // 文字出力が最後のバイトだった時の一時保留 39 staddr += offset; 40 41 char addrhead[] = "Addr"; 42 char hexa[] = "0 1 2 3 4 5 6 7 8 9 A B C D E F"; 43 char charprint[] = "0 2 4 6 8 A C E"; 44 45 printf("\n%s\n" " %s %s %s\n" 46 "-------- ---- ---- ---- ---- ---- ---- ---- ---- ----------------\n", 47 title, addrhead, hexa, charprint); 48 49 while (startcnt < dsize) { 50 printf("%08x ", address); 51 savecnt = startcnt; 52 for (bytecnt = 0; bytecnt < ROW; bytecnt++) { 53 if (startcnt < dsize) printf("%02x", staddr[startcnt]); 54 else printf(" "); 55 if (startcnt & 1) putchar(' '); 56 startcnt++; 57 } 58 startcnt = savecnt; 59 60 putchar(' '); 61 for (bytecnt = 0; bytecnt < ROW; bytecnt++) { 62 if (startcnt < dsize) { 63 unsigned char c = staddr[startcnt]; 64 if (onhold) { 65 putchar(bytecnt == 0 ? ' ' : c); 66 onhold = 0; 67 } 68 else if (iskanji(c)) { 69 if (startcnt + 1 < dsize) { 70 unsigned char d = staddr[startcnt + 1]; 71 onhold = iskanji2(d); 72 if (onhold) { 73 putchar(c); 74 if (bytecnt == ROW - 1) putchar(d); 75 } 76 else putchar('.'); 77 } 78 else putchar('.'); 79 } 80 else putchar(isprint(c) || iskana(c) ? c : '.'); 81 } 82 else putchar(' '); 83 startcnt++; 84 } 85 putchar('\n'); 86 address += ROW; 87 } 88}

void main は int main にしました。

投稿2019/08/08 07:09

編集2019/08/08 07:20
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

dumpをゼロから書き直した方が良いと思います。
カウンターが多すぎます。
カウンターは、0からdsizeまでROWずつ増える物、0からROW-1まで1ずつ増える物、の2つだけにして、書き直してみてください。

投稿2019/08/08 04:35

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問