99Basicインタプリタ Ver qqbas119.lzh (手引き書) INPUT # での悩み
|
99BasicのINPUT #では、データーが正しく読み込まれないケースが少なくありません。正しく読み込むには、INPUT #文の形式に対するデーターの配置法の関係があるのです。それについて、このページで詳しく説明致します。
|
(注:) | ||
データーの手入れの都合では、 | このパターンがもっとも便利なのですが、 | プログラムA、Bのどちらも対応していません。 |
FOR NEXT プログラムとデータの関係 | ||
---|---|---|
150 CLOSE #1: OPEN "ロウサイコーチ.DAT" FOR INPUT AS #1 155 FOR B=1 TO 75: IF EOF(1) THEN 175 160 INPUT #1,FA$(B) 165 IF FA$(B)="**" THEN 175 170 NEXT B 175 FA_MAX=B-1: CLOSE #1 | ||
データー | 結果とコメント | |
ケース.1 A1 , A2 , A3 , B1 , B2 , C1 , C2 , ** , D1 , E1 |
結果 FA$(1)="A1" FA$(2)="D1" FA$(3)="E1" + 「Input past end 」のエラー コメント= 本来は、1つ1つカンマの区切りで読み込まれ、FA$(8)="**"で終わります。 ところが、この同じ行で最初のカンマ以降は飛ばされて、次行が次のデータとなって、本来は終わりとなる ** データ以降も読み込まれています。 データを、半角スペースやダブルコーテーションで囲んでも、同じ結果です。 |
|
ケース.2 A1 , A2 , A3 , B1 , B2 , C1 , C2 , ** , ** D1 , E1 |
結果 FA$(1)="A1" FA$(2)="B1" FA$(3)="C1" FA$(4)="**" コメント= この同じ行で最初のカンマ以降は飛ばされて、次行が次のデータとなって、本来は読み込まれないのは、前のケースと同じ。但し**データを独立行としたため、以降は読み込まれなくなっています。 |
|
ケース.3 A1 , A2 , A3 , B1 , B2 , C1 , C2 , **, D1 , E1 |
結果 FA$(1)="A1" FA$(2)="A2" FA$(3)="A3" FA$(4)="B1" FA$(5)="B2" FA$(6)="C1" FA$(7)="C2" FA$(8)="**" コメント= 1つ1つ独立行としたため、全データを正しく読み込んでいます。ちなみにこのように直した場合、カンマを省いても同様の結果が得られます。 |
経理の科目データーでの実例 | |
200 CLOSE #1: OPEN "ケイリビコウ.DAT" FOR INPUT AS #1 ' 備考メニューDATAの読み込み 210 FOR N=1 TO 150 220 IF EOF(1) OR F$(N-1)="**" THEN ELSE INPUT #1,F$(N) 230 NEXT N結果としては、各行の先頭データー A1 ,B1 ,C1 ,C1 ,H1 , が読み込まれるだけです。 この形式のプログラムでは、各行毎に1データしか読み込まないことは、前記のとおりです。 しかし本来はデータ保守の関係で、グループ別で数行に分けておきたかったのです。 ステップ.2 220 IF EOF(1) OR F$(N-1)="**" THEN ELSE INPUT #1,F$(N), 何とかならないだろかと、すがる思いで , を追加してみました。「FOR NEXT」形式 と「INPUT #1, F$(1), F$(2)」形式を試してみましたが、文法エラーで失敗。 ステップ.3 A1 , A2 , ![]() H7 , ** , というように全データを150行に分ければ、プログラムの変更は無しに、これで簡単に解決します。しかし保守の関係では面倒になります。 しかし、データ・ファイルは1つ、これを読み込む関連プログラムは20弱。この対策がもっとも簡単で、かつ効率的です。 ステップ.4 ケイリビコウ.DATの内容 A1 , A2 , A3 , A4 , A5 , A6 , A7 , B1 , B2 , B3 , B4 , B5 , B6 、、、、、 、、、、、 C1 , C2 , C3 , C4 , C5 , C6 , C7 , C8 , C9 , C10 , C11 , G1 , G2 , G3 , G4 , H1 , H2 , H3 , H4 , H5 , H6 , H7 , ** , このようにデータを1行にまとめた場合は、プログラムも以下のように「INPUT #1, F$(1), F$(2)」形式に変更する必要があります。 200 CLOSE #1: OPEN "ケイリビコウ.DAT" FOR INPUT AS #1 ' 備考メニューDATAの読み込み 210 INPUT #1,F$(1),F$(2),F$(3),F$(4),F$(5),F$(6),F$(7),F$(8),F$(9),F$(10),F$(11),F$(12),F$(13),F$(14),,,,,,,,,,,,,,,, F$(70),F$(71),,,,,,,,,,,,,,, ,,,,,,F$(149)このように続けると順番どおりに読み込まれるが、この場合はエラー。多分、プログラム1行が長すぎたため? ステップ.5 210 INPUT #1,F$(1),F$(2),F$(3),F$(4),F$(5),F$(6),F$(7),F$(8),F$(9),F$(10),F$(11),F$(12),F$(13),,,,,,,,,,,,,,,,F$(69) 230 INPUT #1,F$(70),F$(71),F$(72),F$(73),F$(74),F$(75),F$(76),F$(77),F$(78),F$(79),F$(80),F$(81),,,,,,,,,,,,,F$(149)元の210行を2分割するとエラーはなくなるが、230行のF$(70)以降はヌルです。これでは、エラーが消えても意味がありません。 ステップ.6 そこで1行にまとめたデータ・ファイルを2分割して、後の半分は "ケイリビコウ2.DAT" というファイル名で保存します。 220 CLOSE #1: OPEN "ケイリビコウ2.DAT" FOR INPUT AS #1 ' 備考メニューDATAの読み込み そして更に上記の220行を追加します。 これで正しく読み込まれるようになりますが、データ・ファイルを2分割したため、今度はこちらの保守が面倒になります。 ![]() |
私としては、 | 数10以上のデーターを、数行に改行したもの(本ステップ.1)を、 | 出来れば、「FOR NEXT」形式のプログラム |
◇DATA 氏名1 , 〒1 , 住所1 , 電話1 氏名2 , 〒2 , 住所2 , 電話2 氏名5 , 〒5 , 住所5 , 電話5 ◇元のプログラム DOS-N88BASIC、N88互換BASICに対応 10070 FOR N=1 TO 200 10090 INPUT #1,D$(N) 10120 INPUT #1 ,V$(1,N),V$(2,N),V$(3,N),V$(4,N) 10240 NEXT N ◇改良後のプログラム 99Basicに対応 10070 FOR N=1 TO 200 10090 line INPUT #1,D$(N) 10120 FOR INP_N=0 TO 5 10122 QX=INSTR(Q$,",") 10124 IF QX<>0 THEN V$(INP_N,N)=LEFT$(Q$,QX-1): Q$=RIGHT$(Q$,LEN(Q$)-(QX)) ELSE V$(INP_N,N)=Q$ 10126 NEXT INP_N 10128 D$(N)=V$(0,N) 10240 NEXT N ▲ 上の例は、各データー一行の中に定数のデーターが存在する場合 ▲ ▼ 下の例は、各データー一行の中に存在するデーター数が不定の場合 ▼ ◇DATA (ケイリビコウ.DAT)の内容 秋場**,井上*男,内田 *,遠藤 * 小林*子, 月給料, 月., ヴィラ.イナワシロ, ヴィラ宿代,ヴィラ入湯税, ヴィラ 事務用品,文房具, 切手代, コピー, 本代金., SIAメダル, ITメダル, ガソリン, 有料道路., 駐車場, 宅急便送料, メール便, 運賃送料, 送金手数料,TEL.,TEL.NTT., TEL.NTT.東京, TEL.NTT.猪苗代, TEL.フュージョン , ニフティー ** ◇元のプログラム DOS-N88BASIC、N88互換BASICに対応 155 Q$="": A=0: CLOSE #1: OPEN "ケイリビコウ.DAT" FOR INPUT AS #1 ' 備考メニューDATAの読み込み 157 FOR N=1 TO 110: IF EOF(1) OR FA$(N-1)="**" THEN ELSE INPUT #1,FA$(N): NEXT N 175 ' GOSUB 8000: INPUT Q$ ' 備考の確認 ◇改良後のプログラム 99Basicに対応 155 Q$="": A=0: CLOSE #1: OPEN "ケイリビコウ.DAT" FOR INPUT AS #1 ' 備考メニューDATAの読み込み 157 FOR N=1 TO 50: IF EOF(1) OR Q$="**" THEN 175 160 line INPUT #1,Q$: color 6: PRINT N Q$: color 7 162 FOR I=0 TO 50 164 IF Q$="" THEN 170 ELSE QX=INSTR(Q$,","): A=A+1 166 IF QX<>0 THEN FA$(A)=LEFT$(Q$,QX-1): Q$=RIGHT$(Q$,LEN(Q$)-(QX)): ELSE FA$(A)=Q$: PRINT A FA$(A) , : GOTO 170 168 PRINT A FA$(A) , : NEXT I 170 NEXT N 175 ' GOSUB 8000: INPUT Q$ ' 備考の確認 上記青色文字の PRINT ****は、デバッグのためのもので本来は不要です。