ab.com コミュニティ

ActiveBasicを通したコミュニケーション
現在時刻 - 2024年4月27日(土) 20:34

全ての表示時間は UTC+09:00 です




返信する
ユーザー名:
件名:
メッセージ本文:
メッセージを入力してください。60000 字まで入力できます。 

フォントサイズ:
フォントカラー
オプション:
BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF
BBCode を無効にする
URL を自動的にパースしない
クイズ
お手数ですがカタカナで「エービー」と4文字を入力してください。:
答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。
   

トピックのレビュー - Print#,Input#の仕様?
作成者 メッセージ
  記事の件名:  やっぱり無謀でしたか  引用付きで返信する
仰るとおり、私がオープンしているのはシーケンシャルファイルです。
書くのを忘れていたのですが、
ファイルの先頭に保存しているのはBOOL値の文字列化した物(実際にはそのまま指定している)なので、
-1 -> 0 で文字数が減ったから不具合が出ているのかもしれません。
…よく考えたらそれしか考えられませんね。

バグといってすみませんでした。
でも、一体どこで改行を書き込んでいるのでしょうか?
投稿記事 Posted: 2007年3月18日(日) 19:36
  記事の件名:  Re: Print#,Input#の仕様?  引用付きで返信する
> 「Open ファイル名 As #番号」のオールアクセスで
> 事前にFor Output As #番号で作成したファイルを開き、
> 直後にWrite #またはPrint #を使って値を書き込むと、ファイルの構造がおかしくなります。
> basic\command.sbpを参照してみましたが、どこで改行を追加しているのかがよく分かりませんでした。
イマイチ、どういう状況で生じたかわかりにくいので外しているかもしれませんが。。。。

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

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

全ての表示時間は UTC+09:00 です


ページ移動:  
Powered by phpBB® Forum Software © phpBB Limited
Japanese translation principally by ocean