ファイルに書き込んだ文字列を読み出す処理。
昨日もらった以下の構文を勉強する
★★★★文字列配列読み込み★★★★
{
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 件のコメント:
コメントを投稿