2009年から仕事でMAYAを勉強。MAYAはデフォルトでは使い勝手が悪い。逆にスクリプトを覚えてカスタマイズするとかなり強力なツールになることがわかってきた。

物覚えが悪いので勉強したことはリマインダとしてココに書き留めるようにする。

2009年5月19日火曜日

【MEL】ファイル(配列)読み込み

ファイルに書き込んだ文字列を読み出す処理。
昨日もらった以下の構文を勉強する

★★★★文字列配列読み込み★★★★

{
string $str[];
string $fname = "C:/onogu2/test.txt";

int $fid = `fopen $fname "r"`;

string $val;
int $cnt = 0;

  for( $val = `fgetline $fid` ; size($val) > 0 ; $val = `fgetline $fid` )
  {
  $str[ $cnt ] = $val;
  $cnt++;
  }

  for( $val in $str )
  {
  print $val;
  }

fclose $fid;
}

_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/

for( $val = `fgetline $fid` ; size($val) > 0 ; $val = `fgetline $fid` )
ここのところが自分にはどうにも難解。

  //$val = `fgetline $fid`はfor文の最初に1回だけ行う処理
  //2回目からはsize($val) > 0で文字列がなくなるまで回す
  //文字列がなくなったら$val = `fgetline $fid`の処理を行う

となっているらしいんだけど、以下でも同じ?


{
//見やすくするために変数はあえて動的に宣言
$fname = "C:/onogu2/test.txt";
$fileId=`fopen $fname "r"`;
$nextLine = `fgetline $fileId`;

while ( size( $nextLine ) > 0 )
  {
  print ( $nextLine );
  $nextLine = `fgetline $fileId`;
  }

fclose $fileId;
}

と、whileで文字列(size( $nextLine ))がなくなるまで繰り返す処理ではダメなんかな?スクリプトエディター上では同じ結果を返すんだけど。

文字列を配列$strに取り込む部分をくっつけると以下のような感じ。

string $str[];
$fname = "C:/onogu2/test.txt";
$fileId=`fopen $fname "r"`;
$nextLine = `fgetline $fileId`;
int $cnt = 0;

while ( size( $nextLine ) > 0 )
  {
  print ( $nextLine );
  $nextLine = `fgetline $fileId`;
  $str[ $cnt ] = $nextLine;
  $cnt++;
  }

fclose $fileId;
print $str;

ただ、いずれの場合でも排列には改行コード込みの文字列が代入されているようで、これだと困るかもしれない。for構文とwhile構文の差はいずれわかると思うので先にそっちの問題に進む。(とりあえずwhileを選択)

上のスクリプトに以下を追加

for ($val in $str)
  {
  spaceLocator -name $val;
  }



おおっ!ちゃんと名前のついたロケータが生成されるね!オブジェクトの名前にするぶんには問題なさそう・・・と思ったらなんかおかしい。配列の中身は"aaa","bbb","ccc"なのに、生成されるオブジェクトの名前は
"bbb","ccc","locator1"
で1個ずれてしまう。

試しに文字列を取り出すファイルの先頭に強引に1行書き加えてみる。
"aaa","bbb","ccc","locator1"

になった。つまり配列の個数は正しいが文字列が1個ずれて格納されているらしい。

プログラマにもらった構文にロケータ生成部分をくっつけたらちゃんとできた。これがforとwhileの差か!?いやいや、多分自分の書き方がおかしいに違いない。引き続き調査

わかった!!

while ( size( $nextLine ) > 0 )
  {
  $nextLine = `fgetline $fileId`;
  $str[ $cnt ] = $nextLine;
  $cnt++;
  }

ここで1行目を$strに代入するより先に$nextLineに次の行の文字列が代入されている。順番の問題だった。

while ( size( $nextLine ) > 0 )
  {
  $str[ $cnt ] = $nextLine;
  $nextLine = `fgetline $fileId`;
  $cnt++;
  }

これでOK!







0 件のコメント: