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}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/09 01:51