ファイル

Q 11
ファイルから読み込んだデータ内にNUL文字が存在する場合、NUL文字を除去したい
[内容]
ファイルから読み込んだデータ内にNUL文字が存在すると、NUL文字以降のデータが取得できない場合があるため除去したい

A 11
[解決方法]
NUL文字(文字コード 16進数 00)は文字列の『終端』を示す制御文字です。
そのため、ファイルから読込んだデータを文字列(String型)として扱うと、NUL文字が存在した所で文字列が終了したと認識されそれ以降のデータは読込みされません。

NUL文字を除去する一例としては、以下サンプルソースのようにファイルから読み込んだデータを一度バイナリデータとして保持し、データ内にNUL文字が存在するかをチェックし、NUL文字以外の文字列だけを取得するとの方法があります。

下記サンプルコードでは、ユーザが「ファイル選択」したファイルを10バイトずつ読込み新規作成したファイルへ出力しています。

[サンプルコード] ※記述ポイント抜粋
 Button Button1 {
  X = 4;
  Y = 13;
  Width = 265;
  Height = 27;
  Title = "NUL文字をチェックして読み込む";
  Function OnTouch( e ) {
   var fs = new FileSystem;
   /* var f = fs.open( "/test.txt", FileSystem.OPEN_READ); */
   var f = fs.openDialog("ファイルを開く",
           "テキスト ファイル(*.txt)=*.txt","txt","test.txt");
   /* バイナリで読み込みヌル文字のチェックをする */
   var d = new ByteArray(f.readBinary());
   var len = d.length;
   var point = 0;
   for( var i = 0; i < len; i++ ) {
    /* NUL文字が存在するかチェック */
    if(d.byteAt(i).toString(16) == "0"){
     /* NUL文字位置 */
     point = i+1;
    }
   }
   if(point != 0){
    /* NUL文字が存在する場合*/
    ^.beforeNuldata( f );
    ^.afterNuldata( f , point);
   }else{
    /* NUL文字が存在しない場合*/
    ^.beforeNuldata(f);
   }
   /* ファイルクローズ */
   f.close();
  }
 }
-----(略)
 /*
  * NUL文字前方の文字列取得
 */
 Function beforeNuldata( val ) {
  /* ファイルの読込み位置を「0」に指定 */
  val.Seek(0);
  
  var data = val.read(); 
  Label1.Value = data;
 }
 
 /*
  * NUL文字後方の文字列取得
 */
 Function afterNuldata ( val,pos ) {
  /* ファイルの読込み位置をNUL文字後に指定 */
  val.Seek(pos);
  
  var data2 = val.read(); 
  Label1.Value = str(Label1.Value) + str(data2);
 }

CRSファイル形式のサンプル
   「ファイルから読み込んだデータ内にNUL文字が存在する場合、   
    NUL文字を除去したい(Fil_011.zip)

もご参照ください。

管理番号:Fil_011
  Biz-Collections Bizの宝箱 トップへ
  Biz/Browser・Biz/Designer TIPS集 トップへ