99Basicインタプリタ Ver qqbas119.lzh (手引き書) INPUT # での悩み


 99BasicのINPUT #では、データーが正しく読み込まれないケースが少なくありません。正しく読み込むには、INPUT #文の形式に対するデーターの配置法の関係があるのです。それについて、このページで詳しく説明致します。


◇ パート.1 INPUT #文の形式に対するデーターの配置法

 まずは結論から、(2004/ 5/16現在)
まずは結論から
プログラムでの呼び出し方と、データー配置の作り方の関係
データー プログラムの結果
INPUT #1, DRV$(1), DRV$(2)
プログラムの結果
INPUT #1, DRV$(1): INPUT #1, DRV$(2)
A1 , A2 , A3 ,
B1 , B2 ,
C1 , C2 , C3       (注:)
DRV$(1)="A1" DRV$(2)="A2" 
DRV$(3)="A3"  以降はヌル
「Input past end 」のエラー
DRV$(1)="A1" DRV$(2)="B1" 
DRV$(3)="C1"  以降はヌル
A1 , A2 , A3 ,B1 , B2 ,C1 , C2 , C3
DRV$(1)="A1" DRV$(2)="A2"
DRV$(3)="A3" DRV$(4)="B1"
DRV$(5)="B2" DRV$(6)="C1"
「Input past end 」のエラー
DRV$(1)="A1"  以降はヌル
A1 ,
A2 ,
A3 ,
B1 ,
B2 ,
C1 ,
C2 ,
C3
DRV$(1)="A1"  以降はヌル
DRV$(1)="A1" DRV$(2)="A2"
DRV$(3)="A3" DRV$(4)="B1"
DRV$(5)="B2" DRV$(6)="C1"
プログラムの内容と、その結果
100 OPEN "DRV-2$.TXT" FOR INPUT AS #1: INPUT #1, DRV$(1), DRV$(2), DRV$(3), DRV$(4), DRV$(5), DRV$(6): CLOSE #1
 1.最初のデータ1行だけ読み込まれて、以降の行は無視されます。
 2.最初のデータ1行めの中に カンマがあれば区切にして次のデータと判断します。
プログラムの内容と、その結果
 すべての読み込みにINPUT #1,を追加してみました。
100 OPEN "DRV-2$.TXT" FOR INPUT AS #1: INPUT #1, DRV$(1): INPUT #1, DRV$(2): INPUT #1, DRV$(3): INPUT #1, DRV$(4): INPUT #1, DRV$(5): INPUT #1, DRV$(6): CLOSE #1
  または、
100 OPEN "DRV-2$.TXT" FOR INPUT AS #1
110 FOR N=1 TO 6: INPUT #1, DRV$(N) NEXT N : CLOSE #1
 1.1行ずつを1データと判断し、その行内にカンマがあれば、そこまでをデータとします。
 2.読み込み回数に対して、行数が不足すれば「Input past end」(ファイルは、すでに最後まで読み込まれている)というエラーを出します。
(注:)
 データーの手入れの都合では、 このパターンがもっとも便利なのですが、 プログラムA、Bのどちらも対応していません。
 データーの配置と、プログラムのAかBを合わせる必要があります。大量にデーターがある場合はかなり面倒にはなりますが、諦めるより仕方がないのでは? と思います。
透明スペーサー
 でも、どなたか良い方法をご存じの方がいらしたら、ぜひぜひお教えください(2004/ 5/16)。
   Mailをいただければ幸いです。
 取りあえずの対応は、パート.4 結果OKの対応策で述べる方法で処理出来ましたが、、  (2004/ 7/08 Up)

Top  99Menu



◇ パート.2 INPUT # / FOR   NEXT プログラムとデータの関係

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つ独立行としたため、全データを正しく読み込んでいます。ちなみにこのように直した場合、カンマを省いても同様の結果が得られます。
 1.1行ずつを1データと判断し、その行内にカンマがあれば、そこまでをデータとします。
 2.読み込み回数に対して、行数が不足すれば「Input past end」(ファイルは、すでに最後まで読み込まれている)というエラーを出します。
 FOR   NEXT に限らず、次のような場合も同様です。
100 OPEN "DRV-2$.TXT" FOR INPUT AS #1: INPUT #1, DRV$(1): INPUT #1, DRV$(2): INPUT #1, DRV$(3): INPUT #1, DRV$(4): INPUT #1, DRV$(5): INPUT #1, DRV$(6): CLOSE #1

Top  99Menu


◇ パート.3 INPUT # / 大量データー読み込み処理の実験

経理の科目データーでの実例
ステップ.1
ケイリビコウ.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 ,
** ,
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」形式のプログラム
で読み込みたいのです。
 現状では、データの内容に合わせて、「FOR   NEXT」形式か「INPUT #1, F$(1), F$(2)」形式のプログラムを書くより仕方がないようです。
 でも、どなたか良い方法をご存じの方がいらしたら、ぜひぜひお教えください(2004/ 5/16)。
   Mailをいただければ幸いです。
 取りあえずの対応は、次項で述べる方法で処理出来ましたが、、  (2004/ 7/08 Up)

Top  99Menu


◇ パート.4 INPUT # / 結果OKの対応策 (2004/ 7/08 Up + 7/23 追加)

 以下のように配置されたデーターを、従来からのプログラムでは正しく読み込むことが出来ないことは、既に何度も述べてあります。
 そこで LINE INPUT # を利用して1行毎に読み込んで、INSTR "," を使ってコンマの位置でデーターを分割することにしました。
 以下がその実例です。この対応策なら結果OKです。
◇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 ****は、デバッグのためのもので本来は不要です。

Top  99Menu