こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

vb6.0 sp5]読み込みが出来ない・・・

マルチラインのtext1に20行くらいの文章を
入れて、保存します。tes.txt

a = text1.text

そのtes.txt自体を開くとキチンと文章が入っています。
しかしプログラムからそのファイルを開くと。

Open "tes.txt" For Input As #1
Line Input #1, a
Close #1

Label1.Caption = a

最初の一行しか表示されません。T_T;

投稿日時 - 2004-01-16 19:43:03

QNo.752839

すぐに回答ほしいです

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

>駄目でしょうかT_T;
わかりません。幾多の過去の資源を読み取るためのルーチンです。したがって書き出すほうは.今の文法規約に任せてしまいます。古い資源関係ソフトにWindows関係ルーチンが追加されるだけです。

Put,Get, 関係を使うのであれば.バイナリダンプ・バイナリ編集あたりのフリーソフトでもかき集めて.書式とコードが使えるか.つまり.過去のルーチンが吐き出す内容と書式・コードが一致するかを調べる必要があります。
2つの読み取りルーチンを紹介したのは.改行コードの問題から.どちらが読み取れるか.見当がつかないためであり.バイナリダンプで調べてからでないと.わからないためです。
「よいか・悪いか」ではなくて.コードと書式が一致しているか.を調べてください。これは.古いルーチンで作成したファイルと新しいルーチンで作成したファイルの両方を持っている人間でナイトできません。

私はDebug.exeを使っています。多分.どこかのシステム系ディレクトリーに入っていると思いますが.探してください。なければ.狐バイナリエディターとか.いろいろありますから.べくたーの関係サイトをさまよえばよいでしょう。
もっとも.使いなれたSyndeb.exe(MS-DOS3.3)とかdebug.com(MS-DOS2.14)が私にとっては楽です。

投稿日時 - 2004-01-19 02:48:00

補足

どもです!
aソフトと仮定しまして。
書き出し ⇒はaソフトから。

読み込みもまた ⇒aソフトから。

の場合は書式が一定なのでエラーなく出来た場合
OKということでしょうか?

問題は読み取りにあるようですので、上記の例だと
OKかな??と思いました。

※上記のパターンのプログラムなんで^^;、、
全然判ってない!と思われるなら、無回答でもいいです、初心者に最後までお付き合いして頂ありがとうございました。
PS:明日締め切ります。

投稿日時 - 2004-01-19 11:07:19

お礼

どもです。色々考えていたら新しいことをひらめきました!出来るかどうかまた新しいスレたてます。

ありがとうございました。

投稿日時 - 2004-01-19 17:07:11

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(8)

ANo.7

PUTでやるならGETで取り出しましょう。
すっきりします。

Private Sub Command1_Click()
Open "c:\test.txt" For Binary As #1
Put #1, 1, Text1.Text
Close #1
End Sub

Private Sub Command2_Click()
'Text1.MultiLine = True
Dim a As String
Open "c:\test.txt" For Binary As #1
a = String(30000, " ")
Get #1, 1, a
Text1.Text = a
Close #1
End Sub

Private Sub Command3_Click()
Text1.Text = ""
End Sub

投稿日時 - 2004-01-18 22:21:09

お礼

どもです。GET!にします。
ありがとうございます。ゲッツ!

投稿日時 - 2004-01-19 11:06:27

ANo.6

>とても悲しくなりました。
ソースを見ればわかるとおり.これはライブ。
MS-Basicの山のようなコード(大体3-5MB)をVBに移植するために.過去の関係しそうな部分を共通化したもの。

子供が変なこと覚えてきたものだから.改行コードに0a, 0d, 1a, 00を使う場合があって.その処理用の汎用ルーチンです。

普通のVB関係者ならば.こんな面倒なことをしないで.「できません」と仕様書の方を変更するでしょう。
VBは特定のマイクロソフトが想定した内容の範囲内ならば比較的簡単にソフトを組めます。しかし.子供のような自由奔放にソフトを書く人間にとっては.邪魔なのです。
自分で好き勝手なライブラリを構築して.その中で.独善的絶対的支配者でいたほうが.楽なのです。
文字コードが6種類ぐらい.機種依存処理が持っている機械だけ.変なコードでデータを吐き出す各社市販ソフトとこの市販ソフトで作成した資源の山が1-3GBぐらいあるかな。
この過去の資源を自由に読み取れるために作成されたルーチンのひとつです。

投稿日時 - 2004-01-18 03:03:01

補足

ありがとうございます。
あれから色々やってみたのですが、

Open "test.TXT" For Binary As #1
Put #1, , a
Close #1
で書き込むと " , で区別される事はないですよね?

それで書き込んで、

Open "test.TXT" For Input As #1
Do Until EOF(1)
Input #1, a
Text1.Text = Text1.Text & a & vbCrLf

Loop
Close #1

で読み込む。これだけだとやはり問題が出たり
しますか?少し試したらいい感じだったんですが、
やっぱ駄目でしょうかT_T;

投稿日時 - 2004-01-18 21:34:26

ANo.5

以下のバイナリ処理で読み取れるはず。保守ルーチンが入っているので要注意。OKに開発費3万円程度のソフトをくれてやることになりますが。

Public Function LineInputByte(FileNo%) As String
' Binary で open したファイル用 Line Input #FileNo%,A$
'LineInputByte 改行コード固定(&h0A, &h0D, &h1A)
'LineInput02Byte 改行コード可変(選択した改行コードをLeCode(0)に返す)
'Open File1$ For Binary As #1
'Do Until Loc(1) = LOF(1)
' B$ = LineInputByte(1)
'Loop
'Close #1

Dim Bbyte As Byte
Dim OBbyte As Byte
FSize& = LOF(FileNo%)
A$ = "": OBbyte = 0
ijcount& = 0
Do Until (FSize& = Loc(FileNo%))
ijcount& = ijcount& + 1
Get #FileNo%, , Bbyte
If (Bbyte = 10) Or (Bbyte = 13) Or (Bbyte = 26) Then
If Len(A$) > 0 Then Exit Do
Else
If OBbyte = 0 Then
IB& = GetMSCodeByte&(Bbyte, &H40, MScode$, Haba&)
If Haba& = 1 Then
A$ = A$ + Chr$(IB&)
Else
OBbyte = Bbyte
End If
Else
IB& = GetMSCodeByte&(OBbyte, Bbyte, MScode$, Haba&)
If Haba& = 2 Then
A$ = A$ + Chr$(Val("&H" + MScode$))
OBbyte = 0
End If
End If
End If
Loop
LineInputByte = A$
End Function


Public Function LineInput02Byte(FileNo%, LeCode() As Byte, IER&) As String
' Binary で open したファイル用 Line Input #?,A$
'LineInputByte 改行コード固定(&h0A, &h0D, &h1A)
'LineInput02Byte 改行コード可変(選択した改行コードをLeCode(0)に返す)
'dim LeCode(0 to 3) as Byte
'LeCode(1)=&h00
'LeCode(2)=&h0d
'Open File1$ For Binary As #1
'Do Until Loc(1) = LOF(1)
' B$ = LineInputByte02(1,LeCode(),IER&)
'Loop
'Close #1

Dim Bbyte As Byte
Dim OBbyte As Byte
LeCodeSU& = UBound(LeCode)
FSize& = LOF(FileNo%)
A$ = "": OBbyte = 0: IER& = -1
ijcount& = 0
Do Until (FSize& = Loc(FileNo%))
ijcount& = ijcount& + 1
Get #FileNo%, , Bbyte
IA& = 0: IB& = 0
Do
IA& = IA& + 1
If Bbyte = LeCode(IA&) Then IB& = -1
Loop Until IA& >= LeCodeSU&
If (IB&) Then
LeCode(0&) = Bbyte: IER& = 0
Exit Do
Else
If OBbyte = 0 Then
IB& = GetMSCodeByte&(Bbyte, &H40, MScode$, Haba&)
If Haba& = 1 Then
A$ = A$ + Chr$(IB&)
Else
OBbyte = Bbyte
End If
Else
IB& = GetMSCodeByte&(OBbyte, Bbyte, MScode$, Haba&)
If Haba& = 2 Then
A$ = A$ + Chr$(Val("&H" + MScode$))
OBbyte = 0
End If
End If
End If
Loop
LineInput02Byte = A$
End Function

Function GetMSCodeByte&(Jis1 As Byte, Jis2 As Byte, MScode$, Haba&)
'内部連続コードを返します。
'MsCode$には16進文字列でシフトJisコードを返します
If (Jis2 <= &H3F) Or (Jis2 = &H7F) Then
GetMSCodeByte& = Jis1
IA& = Jis1
MScode$ = NiHex$(IA&)
Haba& = 1
ElseIf (Jis1 >= &H81) And (Jis1 < &HA0) Then
IA& = Jis1 - &H81
IB& = Jis2 - &H20
If Jis2 >= &H80 Then IC& = 1 Else IC& = 0
GetMSCodeByte& = IA& * 188 + Jis2 + 192 - IC&
Haba& = 2
IA& = Jis1
IB& = Jis2
MScode$ = NiHex$(IA&) + NiHex$(IB&)
ElseIf (Jis1 >= &HE0) And (Jis1 <= &HFC) Then
IA& = Jis1 - &HE0
IB& = Jis2 - &H20
If Jis2 >= &H80 Then IC& = 1 Else IC& = 0
GetMSCodeByte& = IA& * 188 + Jis2 + 6020 - IC&
Haba& = 2
IA& = Jis1
IB& = Jis2
MScode$ = NiHex$(IA&) + NiHex$(IB&)
Else
GetMSCodeByte& = Jis1
Haba& = 1
IA& = Jis1
MScode$ = NiHex$(IA&)
End If
End Function

Function NiHex$(IA&)
'IA& を16進2桁文字に書き換える
B$ = Hex$(IA&)
If Len(B$) = 1 Then B$ = "0" + B$
NiHex$ = B$
End Function

投稿日時 - 2004-01-17 03:50:00

補足

どもです。開発費3万円のコードだけあって
すごいです。私じゃとても作れません。
私には参考にするというよりコピペです。^^;

しかし、質問の内容よりかなり大掛かりになってきましたが、皆さんは保存の時このように毎回、大掛かりなコードを書いているのでしょうか???

早い話が、openを使う人みんなは " を使われない
などといいながらやっているのでようか・・・・

a = "<html><body><fontcolor="#00000">"   
に入っている文字をただ保存して

読み込んで
a = "<html><body><fontcolor="#00000">"   
をtextに表示するだけで、これだけのコードを書かなければいけないというのがとても悲しくなりました。

投稿日時 - 2004-01-17 13:58:42

ANo.4

>文章の途中に " が入っているとそこから先が消えて>しまうんです。
今VBAでやってみたら大丈夫でしたが?。
(ただしファイル名は変更しました。C:\test.txtに)

まさかとは思うが、
テキストボックスのWordWrapプロパティはTrueだよね?
(それでも他の行も"で止まるのは謎)

投稿日時 - 2004-01-16 20:58:57

補足

どもです (t_t;;

え!?出来ました????

おかしいな~?出来ませんT_T;


vb6.0ですけど、TEXTにWordWrapプロパティ
なかったですけど、マルチラインはTRUEです。

大文字の ” はOKですが、半角の " を入れると
やはりダメのようですT_T;

投稿日時 - 2004-01-16 21:39:44

ANo.3

Line Input #1, a
は1行(16進0Aや0Dなどの改行コードまで)を読んで、改行コードを除いて、変数にセットしてくれる「ステートメント」なので、「最初の一行しか表示されません」のは当たり前です。EOF(1)がTRUEになるまで繰り返しLine Input #1, a を繰り返し、毎回印刷するか、文字列に順次連結して行かないと全体は見れません。そして印刷や画面に出して、見た目を改行するには、そういうステートメントで印刷や画面表示しないとだめです。
(旧DOS-BASICのPRINT文などは画面に表示して改行した。)
16進表示に変えられるエディタで"tes.txt"の中身を見てください。判りますから。

投稿日時 - 2004-01-16 20:36:30

補足

どもです。

始めにinputでやってたのですが、3行しか表示されず
line inputってなんだろう?とやってみるとさらに1行しか表示されずにT_T;でした。

すぐにinputに戻しましたが、何行書いても3行しか表示されずに、ようやく原因が、 " だと気づきました。

文章の途中に " が入っているとそこから先が消えてしまうんです。
htmlソースの編集用に機能をつけたエディタ
なのでどうしても " が沢山はいります。

" が入っても読み込める方法がございましたらよろしくお願いします。 

投稿日時 - 2004-01-16 20:38:39

ANo.2

一応、tes.txtを開いて問題なければ

自信なかったがやっぱり間違い
EOF→EOF(1)

http://www.g.dendai.ac.jp/lecture/vbasic/vb13.html

投稿日時 - 2004-01-16 20:24:30

補足

どもです、お疲れ様です^^;

ホームページのhtmlソースを
text1に入れて、保存。

読み込みを押して、text1に出した後に修正。

をやろうと思ってたんですが、さっきから色々やってわかったことが " ←が入っているところから読み込まない・・・のようなのです。

例えば text1に
<table><tr><TD width="100" bgcolor=#3366cc height="50">
とhtmlソースを入れて保存、(txtに保存される)

しかし読み込むと,<table><tr><TD width=" ←この
"で区切られるようなのです。

いったん出来たと思ったのですが ’ ”の違いで錯覚を起こしていて結局振り出しに戻った状況です。T_T;

神様~

投稿日時 - 2004-01-16 20:28:50

ANo.1

ためしに

Open "tes.txt" For Input As #1 'test.txtじゃ無いんだ
Line Input #1, a
Label1.Caption = a
Line Input #1, a
Label2.Caption = a
Line Input #1, a
Label3.Caption = a
Close #1
ってやるとどうなります?

投稿日時 - 2004-01-16 20:22:09

あなたにオススメの質問