ab.com コミュニティ
https://www.activebasic.com/forum/

Print#,Input#の仕様?
https://www.activebasic.com/forum/viewtopic.php?t=1865
ページ 11

作成者:  THEREMIN [ 2007年3月18日(日) 00:12 ]
記事の件名:  Print#,Input#の仕様?

「Open ファイル名 As #番号」のオールアクセスで
事前にFor Output As #番号で作成したファイルを開き、
直後にWrite #またはPrint #を使って値を書き込むと、ファイルの構造がおかしくなります。

具体的に言うと、
Print #0  なら 30 0D 0A で書き込んだ箇所が30 0D 0A 0Aに
Print #0,  なら  30 09 0D 0A で書き込んだ箇所が30 09 0D 0A 0Aに
Print #0,;  なら  30 09で書き込んだ箇所が30 09 09に
こんな感じで、出力した文字の後ろの区切りコードがダブってしまいます。

Print #0,;の場合ならタブが増えるだけなので実害は無いのですが、改行の場合は正しく読み込むことができません。
色々試してみたのですが、ファイルの終端に0Aがくっついてしまうケースもありました。
自分で手直ししようと思って
basic\command.sbpを参照してみましたが、どこで改行を追加しているのかがよく分かりませんでした。

作成者:  河川屋 [ 2007年3月18日(日) 13:03 ]
記事の件名:  Re: Print#,Input#の仕様?

> 「Open ファイル名 As #番号」のオールアクセスで
> 事前にFor Output As #番号で作成したファイルを開き、
> 直後にWrite #またはPrint #を使って値を書き込むと、ファイルの構造がおかしくなります。
> basic\command.sbpを参照してみましたが、どこで改行を追加しているのかがよく分かりませんでした。
イマイチ、どういう状況で生じたかわかりにくいので外しているかもしれませんが。。。。

そもそも、N88BASIC(など)では、オールアクセスとして解説されていません。
これって、ランダムファイルのオープン命令として解説されています。
ランダムファイルはオールアクセスには違いないから、間違っているとはいえないけど、
非常に紛らわしい表現です。

オールアクセスで開いてシーケンシャル書きした場合、
書いた範囲「だけ」新しいデータとなり、それ以降は古いデータのまま残る(バイト単位で。)ため、
通常、書いた範囲の最後と、前のデータの境界が整合しません。
したがって、普通は、オールアクセスでオープンしません。
(元ファイルのレコード長を把握していて、かつ、データ書き込み後もレコード長が以前と同じ
 という、超レアケースの場合のみオールアクセス使用可能。)
超レアケースを除けば、
新規書き込み(For Output As #...) ※書き込んだデータより後ろは消えてしまう  または
追加書き込み(For Append As #...) ※既存データの後ろに書く。
のどちらかで開けるしかないです。
ですので、事実上、
・オールアクセスで開いてシーケンシャル書きはできない(データが壊れる)
 シーケンシャル1ファイルを読むのと書くのを同時に行うのはもってのほか(読んだファイルと別のファイルに書き出す必要あり)
と考えて間違いないです。

作成者:  THEREMIN [ 2007年3月18日(日) 19:36 ]
記事の件名:  やっぱり無謀でしたか

仰るとおり、私がオープンしているのはシーケンシャルファイルです。
書くのを忘れていたのですが、
ファイルの先頭に保存しているのはBOOL値の文字列化した物(実際にはそのまま指定している)なので、
-1 -> 0 で文字数が減ったから不具合が出ているのかもしれません。
…よく考えたらそれしか考えられませんね。

バグといってすみませんでした。
でも、一体どこで改行を書き込んでいるのでしょうか?

ページ 11 全ての表示時間は UTC+09:00 です
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/