• ベストアンサー

バイナリファイルに含まれているNULLを削除する方法を教えてください。

C、またはVCで、バイナリファイルに含まれるNULLを削除するツールを作りたいのですが、よい知恵がありましたらご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.2

a-saitohさんのとは違うやり方でサンプルを作ってみました。 ・コマンドプロンプト上で動かすコンソールアプリケーションです。 ・コマンドラインで入力ファイル(変換元)と出力ファイル(変換先)を指定します。 お役に立てれば幸いです。 注)エラー処理は適当なので実際のアプリケーション等に組込む場合は、   もっと厳密に行った方が良いと思います。 /* * delnul.c :バイナリファイルのNULLコード削除プログラム * <コマンドライン形式> * delnul [入力ファイル] [出力ファイル] */ #include <stdio.h> #include <stdlib.h> /* define */ #define BUFSIZE 2048 /* * main */ int main(int argc, char* argv[]) { char *fileNm1; char *fileNm2; FILE *fileSt1; FILE *fileSt2; char bbuf1[BUFSIZE]; char bbuf2[BUFSIZE]; int i; int lenrd; int lenwt1, lenwt2; /* parmeter check */ if(argc < 3){ printf("** Parameter Error!!\n"); return 1; } /* filename get */ fileNm1 = argv[1]; fileNm2 = argv[2]; /* input file open check */ if((fileSt1 = fopen(fileNm1, "rb")) == NULL) { printf("** Input file open Error!!\n"); return 2; } /* output file open check */ if((fileSt2 = fopen(fileNm2, "wb")) == NULL) { printf("** Output file open Error!!\n"); fclose(fileSt1); return 3; } /* file data transration */ while(1) { lenrd = fread(bbuf1, sizeof(char), BUFSIZE, fileSt1); if(lenrd < 1) break; for(lenwt1=0,i=0; i<lenrd; i++) { if(bbuf1[i] != 0){ bbuf2[lenwt1++] = bbuf1[i]; } } lenwt2 = fwrite(bbuf2, sizeof(char), lenwt1, fileSt2); } /* file close */ fclose(fileSt1); fclose(fileSt2); return 0; }

miyatyee
質問者

お礼

ご回答ありがとうございます。 できました!a-saitohさんのプログラムと結果を比較したら一致しました。 このプログラムだと、ファイルを指定できるのが魅力的ですね。 ありがとうございました!

その他の回答 (1)

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.1

削除は難しいですが,あるファイルの内容のNULL以外を抜き出して別ファイルにコピーするのでは駄目でしょうか? あとでファイル名の付け替えをすれば,NULLを削ったのと同じですが. #include<stdio.h> #include<stdlib.h> int main(void) { int c; while((c=getchar())!=EOF)if(c)putchar(c); return 0; } この書き方だとコマンドプロンプトからしか動きませんが.

miyatyee
質問者

お礼

ご回答ありがとうございます。 早速試してみたところ、できました! こんなにシンプルにできてしまうんですね。 ありがとうございました。

関連するQ&A