BASICのPRINT#命令で最終位置に化け文字がつく問題

このQ&Aのポイント
  • BASICのPRINT#命令で最終位置に化け文字がつく問題について解説します。
  • 「PRINT #」を使ってファイルに書き出す際、最終のレコードを書き出した一番最後の位置に化け文字がついてしまう問題があります。
  • この問題を解決するために、バイナリエディタによる内容の確認と「1A」という文字を除去する方法があります。
回答を見る
  • ベストアンサー

BASICのPRINT#命令

必要にかられ、ベーシックでプログラムを記載していま す。ファイルに書き出す命令で「PRINT #」を使ってる のですが、最終のレコードを書き出した一番最後の位置に 化け文字がついてしまいます。 以下のようにコーディングしています。 ================================================== 20 OPEN "a" FOR INPUT AS #1 30 OPEN "b" FOR OUTPUT AS #2 32 INCNT=0 40 IF EOF(1)=-1 THEN 100 51 D128A$=INPUT$(128,1):D128B$=INPUT$(128,1):CRLF$=INPUT$(2,1) 52 IF LEFT$(D128A$,1)="S" THEN PRINT #2,LEFT$(D128A$,128); 57 IF LEFT$(D128B$,1)="E" THEN PRINT #2,LEFT$(D128B$,128); 58 INCNT=INCNT+1 90 GOTO 40 100 CLOSE #1,#2 ================================================== バイナリエディタで内容を見ると「1A」となっています。 これをつけたくないのですが、、、、 簡単に言えば、INPUTのファイルから128バイトずつの データを抜き出し、横一列に並べたいのです。 古い人の作成したもので、資料が手元になくて困って います。 ご存知の方がいれば教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • ftomo100
  • ベストアンサー率41% (297/723)
回答No.6

putダメですか... ツールですが、テキストエディタではなくて 参考URLのようなユーティリティをBASIC上で DOSコマンドの呼び出しか、BASICを起動している バッチから呼び出せば良いかと思ったんですが。

参考URL:
http://www.vector.co.jp/soft/dos/util/se158075.html
win95user
質問者

お礼

はやりBASICのみでは難しいですか。 フリーソフトも検討してみます。

その他の回答 (5)

  • ftomo100
  • ベストアンサー率41% (297/723)
回答No.5

PRINT #2,LEFT$(D128A$,128) 出力されるのはどう見てもレコードサイズ128バイトの固定長なんですが^^ ファイルサイズとレコードサイズの違いはOKですよね? もしくは、このプログラムはこのまますすめて 終了後に、別途にツールを起動して除去してはどうでしょう?

win95user
質問者

お礼

回答をいただきありがとうございます。 すみません言葉が足りなかったです。 書き出す時が固定長の128バイトであれば 全て書き出された後、最終的なファイルの長さが 固定でなくてよいと言う意味でしたか。(^^ゞ >終了後に、別途にツールを起動して除去しては >どうでしょう? 私、個人が使う場合は良いのですが、現場の人に テキストエディタを開いてそこを消していただくのは 厳しいです。

win95user
質問者

補足

PUT命令を使ってみましたが、やはり最後に同じものが ついてしまいます。 はまってしまいました・・・

  • ftomo100
  • ベストアンサー率41% (297/723)
回答No.4

んー、せっかくINCNTをカウントアップしているのだから PUT #2,INCNT,LEFT$(D128A$,128) では?

参考URL:
http://www.eli.hokkai-s-u.ac.jp/~kusiyama/Inf1_Basic/Grammar_3.html
win95user
質問者

お礼

回答をありがとうございます。 ランダムファイルについて少し調べたのですが 固定長のファイルでファイルのように見えます もともと書き出すファイルが可変で、そのまま 使うのは難しい気がします。 勘違いで指摘してください。m(__)m

  • okichan
  • ベストアンサー率11% (4/36)
回答No.3

511 IF EOF(1)=-1 THEN 100 52 IF LEFT$(D128A$,1)="S" THEN PRINT #2,LEFT$(D128A$,128); の用にプリント命令のまえにエンドオブファイルの 分岐命令を入れては!

win95user
質問者

お礼

回答をありがとうございます。 >プリント命令のまえにエンドオブファイルの >分岐命令を入れては! と言いますと・・・・・ すみません、大変、厚かましいのですが もう少し教えていただけないでしょうか m(_ _)m

  • bob_n
  • ベストアンサー率35% (610/1732)
回答No.2

INPUT #の文の中にスペース、改行、および復帰文字は無視され、それ以外の最初の文字から、読み取られると書かれていました。 最初の文字が(")引用符であれば、引用符付きデータとして割り当てられると書かれていました。 見当違いの回答でしたらごめんなさい。すこしても、やくにたてばと書きました。

win95user
質問者

お礼

回答をありがとうございます。 読み取ったファイルのデータを表示して見て 特に問題はなかったので、書き出すときに自動で ついてしまうのかなと思いました。 なにか回避する方法があれば、、、 と言った所です。

  • ftomo100
  • ベストアンサー率41% (297/723)
回答No.1

1AはEOF(ファイルの終端を表す)なので、消す事はできないと思います。 シーケンシャルアクセスでなくて、ランダムアクセスで書き出してはどうでしょうか?

参考URL:
http://www.geocities.jp/tahrayan/utili/nfcnv.html
win95user
質問者

お礼

回答をありがとうございます。 ランダムファイルにしてしまうと、書き出した時の 並びが崩れてしまわないか心配です。 転送用のデータの組み立てなので、順番が崩れると 困ってしまいます。 もともと、使っていた転送ソフトが、古くて新しい ものに代えたら、以前よりも、データのチェックが 厳しくなり、困っています。 PRINT#以外でも使える命令があればと思います。

関連するQ&A

  • サブルーチン

    下は身長の平均を求めるプログラムですけど、身長の高い順、低い順に並び替えしたいんですがどうしたらいいかわからないので、よかったら誰か教えていただけませんか                   REM プログラム     10            DIM A(12) 20 PRINT "メニュー” 30 PRINT "身長入力...1" 40 PRINT "身長出力...2" 50 PRINT "終了" 60 PRINT "どれにしますか" 70 INPUT B 80 IF B=1 THEN GOSUB300 ELSE 110 90 GOTO 30 100 IF B=2 THEN GOSUB500 ELSE 130 110 GOTO 30 120 IF B=3 THEN GOSUB700 ELSE 30 130 END 140 A(11)=B 300 FOR I=1 TO 10 310 PRINT i;: PRINT "人目" 315 INPUT C 320 A(I)=C 330 PRINT "これでいいですか?" 340 PRINT "1.YES 2.NO" 345 INPUT D 350 IF D=1 THEN 380 ELSE 370 360 IF D=2 THEN 315 ELSE 340 370 A(11)=A(11)+A(I) 380 NEXT I 390 RETURN 400 IF C=1 THEN 520 500 PRINT "先に入力してください" 510 GOTO 30 515 FOR I=1 TO 12 520 PRINT A(I) 530 NEXT I 540 RETURN 550 PRINT "これで身長の平均を求めるのを終わります"700 RETURN 710  

  • Tiny Basic 日本語

    Tiny Basic for Windows v1.21を利用しているものです。 入力した日本語を後ろから表示したいです。あいうと入力したら、ういあと出力したいです。 以下が実行したプログラムです。 10 INPUT "お名前は?: ", U$ 20 PRINT "こんにちは "; U$ ;" さん" 25 REM 30 INPUT "丸がいくつ欲しいですか?: "; N 35 S$ = "" 40 FOR I = 1 TO N 50' S$ = S$ + "○" print "○" 55 NEXT I 60 'PRINT S$ 65 REM 70 INPUT "もう一度やりますか(Y/N)? "; A$ 80 IF LEN(A$) = 0 THEN GOTO 70 90 A$ = LEFT$(A$, 1) 100 IF (A$ = "Y") OR (A$ = "y") THEN GOTO 30 110 PRINT "さようなら " 111 INPUT "挨拶はなん回: "; N2 120 FOR I = 1 TO N2 130 PRINT RIGHT$(U$,6); "さん "; 140 NEXT I 150 PRINT 160 PRINT "さようなら " 170 END 行番号130の処理では、アルファベットを後ろから表示できました。ひらがなや漢字はそうなりません。 御指摘お願いします。

  • Excel VBAの文字列と数値の分類

    txtファイルで取り込んだ2行にまたがっている数値・英文字・ひらがななどを、数値だけのtxtファイルとそれ以外のtxtファイルを別々に作成し、保存するプログラムを組みたいのですが、よく分かりません。 ちなみに、使っているOSとAPはWinXP、Excel2003です。 InputData.txtの内容 A34bFg7p0 あ 1ylut890 B45LK4L え Number.txtの完成形 34701890454 String.txtの完成形 AbFgp あ ylutBLKL え '変数の宣言 Dim myFile As String Dim CC As Integer Dim XX As Integer Dim WW As Variant Dim str As String Dim tempStr As String Dim B As String Dim C As String myFile = Dir("InputData.txt") 'ファイルの読み込み If myFile = "InputData.txt" Then Open myFile For Input As #1 Do While Not EOF(1) Input #1, myText Loop '書き込みファイルの作成 Open "Number.txt" For Output As #2 Open "String.txt" For Output As #3 '数字・文字列の分類 CC = Len(myFile) For XX = 1 To CC str = Mid(myFile, XX, 1) If str >= 0 And str <= 9 Then B = B & str Else C = C & str End If Next Print #2, B Print #3, C Close #1, #2, #3 'エラーメッセージの表示 Else MsgBox "ファイルは存在しません。" End If ここまでやっている状態です。よろしくお願いします。

  • 十進ベーシックのプログラムの間違いを教えてください。

    誰か次のプログラムの間違いを直してください。入力を間違えても次に進めるようにするにはどこをどう変えたらよいのですか? RESTORE 30 READ a$ 40 INPUT b$ IF a$=b$ THEN IF a$<>b$ THEN GOTO 40 PRINT a$ GOTO 30 DATA i,x,d,k,k,h,end END IF END

  • VBA 複数のファイルの特定の列だけ取得してマージ

    お世話になっております。 VBAで、複数のCSVファイルの特定の列だけを抽出して別のCSVファイルにマージする方法を探しています。 例えば、マージフォルダに1000のCSVファイルがあります。 1000あるファイルのA列とC列だけを抽出して、 それを別の「マージ.CSV」というファイルにA列とB列にマージして一つにしたいのです。 1000のファイルにはA~Qまで値が入っていて、A~Q列の値全て取り込みマージするとデータが重くなってしまうのです。 Unionメソッドを仕様して列を選択するのかなと思うのですが。。。 現在、こちらのコードを参考にしています。 わかる方いましたらよろしくお願いいたします。 Sub csvmerge() wpath = Range("B3") wfile = Dir(wpath & "\") flag = 0 Do While wfile <> "" If InStr(wfile, ".csv") Then flag = flag + 1 If flag = 1 Then FileCopy wpath & "\" & wfile, ThisWorkbook.Path & "\output.csv" Open ThisWorkbook.Path & "\output.csv" For Output As #1 Close #1 End If Open ThisWorkbook.Path & "\output.csv" For Append As #1 Open wpath & "\" & wfile For Input As #2 Do Until EOF(2) Line Input #2, w_str Print #1, w_str Loop Close #2 Close #1 End If wfile = Dir() Loop MsgBox "マージ完了", vbInformation End Sub

  • VBA-読み込んだテキストファイルを並び替えて書き出したい

    VBA-読み込んだテキストファイルを並び替えて書き出したい ch1=FreeFile Open A for Input as ch1 ch2=FreeFile Open B for Input as ch2 DO while Not EOF(ch1) Line Input #ch1,buf Print #ch2,buf Loop Close #ch1,#ch2 で読み込み、書き出すことはできました。 やりたいことは、書き出す時に、項目を並べ替えたいのです。 例 にんじん りんご ねこ だいこん バナナ いぬ ↓ りんご ねこ にんじん バナナ いぬ だいこん よろしくお願いいたします。 区切りはタブです。

  • N88互換BASICのプログラムについて。

    私は機械科3年ですが、今年からBASICを勉強しています。次のプログラムのエラー(行番号190にてopenしたファイルに出力できないです)がどうしても解決できないです。N88互換BASICやられている方でどなたか私にアドバイスをしていただけると助かります。 110 REM EX1B by E/F on 2006/04/25 120 PI=3.14159:PHI=30:Y0=.5 130 '************ Output into File ************ 140 CLOSE #1:OPEN "C:\WINBASIC\EX1B_OUT.TXT" FOR OUTPUT AS #1 150 FOR X=0 TO 360 STEP 45 160 A=.2 :Y1=A*SIN((X-PHI))+Y0 170 A=1.2 :Y2=A*SIN((X-PHI))+Y0 180 A=2 :Y3=A*SIN((X-PHI))+Y0 190 PRINT #1,X;",";Y1;",";Y2;",";Y3" 200 PRINT"Out:";X;",";Y1;",";Y2;",";Y3 210 NEXT X 220 CLOSE #1 230 '************ Input from File ************** 240 CLOSE #2:OPEN "C:\WINBASIC\EX1B_OUT.TXT" FOR INPUT AS #2 250 IF EOF(2)<>0 THEN GOTO 190 260 INPUT #2,X,Y1,Y2,Y3 270 PRINT"Inp:x=";X;" y1=";Y1;" y2=";Y2;" y3=";Y3;" 280 GOTO 150 290 CLOSE #2 300 '***** Close All Files and Computer Stop***** 310 CLOSE 320 END

  • 配列にて格納したデータの出力

    txtファイルで取り込んだ2行にまたがっている数値・英文字・ひらがななどを1行ずつ配列として格納した後に、数値だけのtxtファイルとそれ以外のtxtファイルを別々に作成し、保存するプログラムを組みたいのですがよく分かりません。 ちなみに、使っているOSとAPはWinXP、Excel2003です。 InputData.txtの内容 A34bFg7p0 あ 1ylut890 B45LK4L え Number.txtの完成形 34701890 454 String.txtの完成形 AbFgp あ ylut BLKL え '変数の宣言 Dim myFile, myText, myList(), myList2(), str, B, C As String Dim XX As Integer Dim myFunc As Boolean Dim cnt, i As Long On Error GoTo myError myFile = Dir("InputDama.txt") 'ファイルの読み込み If myFile = "InputDama.txt" Then Open myFile For Input As #1 Do While Not EOF(1) Line Input #1, myText If myText <> "" Then If cnt = 0 Then ReDim myList(cnt), myList2(cnt) Else ReDim Preserve myList(UBound(myList) + 1), myList2(UBound(myList2) + 1) End If '数字・文字列の分類 CC = Len(myText) For XX = 1 To CC str = Mid(myText, XX, 1) If IsNumeric(str) = True Then '←数字かどうかはIsNumericで判断 B = B & str Else C = C & str End If Next myList(cnt) = B myList2(cnt) = C cnt = cnt + 1 End If Loop '書き込みファイルの作成 Open "Number.txt" For Output As #2 Open "String.txt" For Output As #3 For cnt = 0 To UBound(myList) Print #2, myList(cnt) Next cnt For cnt = 0 To UBound(myList2) Print #3, myList2(cnt) Next cnt Close #1, #2, #3 End Sub これだと、2行目に1行目で格納したデータが最後出てしまうので、それを取り除きたいのですが、効果的な方法が分かりませんので、宜しくお願いします。

  • VBで複数のテキストを結合するときの問題

    教えてください!お願いします。 VB6を使って、複数のテキストファイル(~.txtで保存しているもの)を 一つずつ読み込んで、それらを結合して1つのファイルにして リッチテキストボックスに表示する、というツールを作成しています。 一応うまく出来たのですが、ただ、結合した時にそれぞれのテキストの 間にどうしても1行ブランクが入ってしまうんです。 このブランク行を削除して、結合したファイルの継ぎ目がきれいに 続いて表示されるようにする方法はありますでしょうか? ブランク行を全て削除してしまうのではなく、ファイルとファイルの 間に挿入されてしまうブランク行だけをなくしたいのです。 ちなみに Open App.Path & "\" & List1.List(List1.ListIndex) For Input As #FileNum Do Until EOF(FileNum) Line Input #FileNum, ddd gggg = gggg & ddd & vbCrLf Loop Close #FileNum このようにリストに載っているテキストファイルを全部読み込んで、 If Dir(書き出すテキストファイル) = "" Then Open 書き出すテキストファイル For Output As #FileNum Print #FileNum, gggg Close #FileNum Else Open 書き出すテキストファイル For Append As #FileNum Print #FileNum, gggg Close #FileNum End If 書き出すファイルが存在しなければそのまま保存し、書き出すファイルが あれば、そのファイルに追記するというコードにしています。

  • ACCESSVBAでラジオボタンを実行させたい

    フォームにラジオボタンを作成し、それぞれ、A・Bと設定しました。 (プロパティで”名前”を”A””B”とした) そこで、Aを選択した場合に、Aのコードを実行させ、 Bを選択した場合にBのコードを実行させたいと考えています。 以下のコードを作成しましたが、うまくいきません。 どこが間違っているのでしょうか。よろしくおねがいします。 ********************************************** Private Sub test_Click() Dim fNAME As String fNAME = "c:\test.htm " Open fNAME For Output As #1 Print #1, "<html>" Print #1, "<head></head>" Print #1, "<body>" If & A & = True Then Print #1, "<table>" … Print #1, "</table>" ElseIf & B & = True Then Print #1, "<table>" … Print #1, "</table>" End If Print #1, "</body></html>" End Sub

専門家に質問してみよう