C言語関係掲示板

過去ログ

No.606.テキストファイルに合わせて改行するエディタ

[戻る] [ホームページ]
No.5801

バイナリエディタのようなもの
投稿者---じいさん(2003/04/15 06:19:25)


バイナリエディタのようなものを作成しています。
通常のエディタだと読み込むテキストファイルが

abc
defg

となっていても

61 62 63 0D 0A 64 65 66 67 abc..defg

となりますが、私は読み込んだテキストファイルに合わせて
改行するエディタが必要です。つまり

61 62 63 0D 0A   abc..
64 65 66 67      defg

なんとか、本を見ながら

61 62 63 0D 0A
64 65 66 67

と表示できるようにはなったのですが、後半の

abc..
degf

の表示方法がわかりません。
(abcの後の..は表示されなくても良いのですが)

60歳の手習いで始めたばかりの、初心者なので、
難しいことはよくわかりませんが、
どなたかアドバイスいただきたくお願いいたします。

  #include <stdio.h>

  int main()
  {
      FILE *fp,*fpo;
      int c;
      int i;

      fp = fopen("demo.txt", "rb");
      fpo = fopen("dump.txt","wb");

      fprintf(fpo,"16進ダンププログラム\n\n");

      i = 1;
      fprintf(fpo,"\n%03d行目 : ", i);
      
      while ((c = fgetc(fp)) != EOF) {
        fprintf(fpo,"%02X", c % 256);
        fprintf(fpo," ");
		
	   if(c == 0x0a ) {
	      i++;
               fprintf(fpo,"\n%03d行目 : ", i);	
             }
      }
      fprintf(fpo,"\n");
      fclose(fp);
      fclose(fpo);
      return(0);
  }


No.5818

Re:バイナリエディタのようなもの
投稿者---kikk(2003/04/15 16:08:21)


ども。


2通りくらい方法があります。

・その1
1行が十分におさまる長さのcharの配列を用意する。そこに読んだ文字を
ためていく(たぶん代入時にキャストが必要)。読んだ文字が改行ならば、
ためておいた文字(列)をfprintf()の%sか、fputs()を使って出力する。
ファイルの終わりまで以上を繰り返す。用意した配列は何度も使いまわす
ことになる。

・その2
1行が十分におさまる長さのcharの配列を用意する。それを使い、ファイルの
読み込みを行単位で行うようにする(fgetc()ではなくfgets()を使う)。
1行読んだら、配列の先頭から順に終わり(\0)がくるまで文字の16進を出力し
最後に行全体を(その1と同様の方法で)出力する。ファイルの終わりまで
以上を繰り返す。用意した配列は何度も使いまわすことになる。
# ループが入れ子になります


その1は修正が(2よりも微妙に)少なくてすみます。ただ、わたしが自分で
作るとしたら、関数の呼び出し回数が少ないその2にすると思います。


では。