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

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

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

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

Q&A

解決済

3回答

3736閲覧

C言語 ダンプ出力したい

kokok

総合スコア145

C

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

0グッド

0クリップ

投稿2019/08/08 08:47

c

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

下記のコードで16文字ずつ textdata の中を読み込みたいのですが

テキストファイル
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 私たちああああ Corpo

一行出力して終わってしまいます。
アドバイス頂けると助かります。

c

1コード 2 3while (readnum = fread(txt_data, sizeof(unsigned char), TEXTBUF, file) > 0) { 4 5 dump("テキストファイル", txt_data, 0, TEXTBUF, C_PRT + H_PRT); 6 } 7 fclose(file); 8}

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

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

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

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

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

guest

回答3

0

ほとんど、答えは出てますが、

static int startcnt = 0;// ダンプするバイト数のカウント

ここの初期化は、最初のみなので、二回目以降に呼ばれた時に前の値。
次の行に、startcnt = 0; でも良いですが、まあ、普通には、static削除が一般的でしょう。
他のも不要なのがありますね。 savecntも不要。headercntも無しで済みそうですが、要確認か?
あと、壊れた漢字対策とか、最後のバイトが漢字前半の場合の位置ずれとか、ちょっと気になりますが、とりあえず、保留。

投稿2019/08/08 13:51

pepperleaf

総合スコア6383

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

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

kokok

2019/08/09 01:51

address, onholdのみstaticでした。
guest

0

static int startcnt = 0;// ダンプするバイト数のカウント

static の意味を考えてください。
なぜ、stataic を付けたんですか?

投稿2019/08/08 09:36

kazuma-s

総合スコア8224

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

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

kokok

2019/08/08 10:17

staticいらないですね。
kazuma-s

2019/08/08 10:55

なぜ、stataic を付けたんですか? 何がしたいんですか?
guest

0

ベストアンサー

Cのコードを書くなら、VisualStudioとかEclipseなどのデバッグできる環境を整えましょう。
ソースコードの任意の行で実行を止め、変数の値を見ることができます。
また、1行づつ実行することもできます。
そうすれば、あてずっぽでコードを書かなくて済むようになり、こんなところで何度も質問を書かなくてもいいようになります。

投稿2019/08/08 08:55

編集2019/08/08 09:08
y_waiwai

総合スコア87719

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問