VB6.0
text1 text2 text3 がありまして、そこへ文字を入れます。
このほかにもチェックボタンがあります。
text1へ「私の名前は”コップ”です」と入れます。
これで保存します。
それで保存したものを再度読み込んで、text1に表示させると
text1に「私の名前」
text2「コップ
のように区切られてしまいます。また他のチェックとかも勝手に入ります。
”を使いたいのですが、諦めるしかないでしょうか・・・・
保存って…Print?それともWrite?それ以外?
ソースがないからなんともいえません。
区切られたりするのはソースの問題です。
後、”は表示できます。
くわしく説明するにはソースを開示して
いただく事が一番なのですが・・・
Chr(34)に変換しないといけないのかな
編集 削除説明不足ですみません。
a = text1
b = text2
c = text3
(以下省略)
Open ***** For Output As #1
Write #1, a,b,c,d,e,f,g ・・・・・・
で書き込んでいます。
Open ***** For input As #1
input #1, a,b,c,d,e,f,g ・・・・・・
で開いて
text1.text = a
text2.text = b
とすると、text1の文章途中に”を入れたところが勝手にtext2に
入ったりします。
>保存って…Print?それともWrite?それ以外?
printとwriteって違うんでしょうか? 本には同じですと書いてあったんですがT_T;
よろしくお願いします。
今までやってみて、どこが問題か少しわかったので報告します。
text1.text = あい"うえお と入力。
これを保存
a = text1.text
Open ***** For Output As #1
Write #1, a
close #1
これで文章はこのように保存されます。
"あい"うえお"
この為に、読み込んださいに a の中の「あい」しか
読み込まないという状況だと思うんです。
実際にはtext1にはhtmlを打ち込むので " は頻繁にはいります。
しかしこの問題で読み込んで修正が出来ませんT_T;
なにか方法がありますでしょうか?
Printを使うと"←ダブルクォーテーション(合ってるかな?^^;)は出力されませんよ。
'textbox1からファイル保存→hoge.txt
FileOpen(1, "hoge1.txt", OpenMode.Output, OpenAccess.Default)
Print(1, Text1.Text)
FileClose(1)
'hoge1.txtからファイル読み込み→textbox1
FileOpen(1, "hoge1.txt", OpenMode.Input, OpenAccess.Default)
Do Until EOF(1) 'ファイル末端まで読み込み
Text1.Text = TextBox2.Text & LineInput(1) & Chr(13) & Chr(10)
Loop
FileClose(1)
修正
×12:Text1.Text = TextBox2.Text & LineInput(1) & Chr(13) & Chr(10)
○12:Text1.Text = Text2.Text & LineInput(1) & Chr(13) & Chr(10)
freefile()・変数を使って書き直して下さいね^^;
あ・・・申し訳ないです。修正の修正なんてtext1.textです
編集 削除その使い方なら Line Input でいいんでないかなぁ。
form1、comannd1、command2、大きめのtext1、text2を作る。
text1、text2にmultilineをTrue、ScrollBarsを 3 にでもしておく。
↓これをはる
Option Explicit
Private Const strTestFilename = "c:\test.txt"
Private Sub Command1_Click()
Dim intFileNum As Integer
intFileNum = FreeFile
Open strTestFilename For Output As #intFileNum
Print #intFileNum, Text1.Text
Close #intFileNum
MsgBox "かきこみおわり"
End Sub
Private Sub Command2_Click()
Dim intFileNum As Integer, strBuf As String
Text2.Text = ""
If Len(Dir$(strTestFilename)) Then
intFileNum = FreeFile
Open strTestFilename For Input As #intFileNum
Do While (Not EOF(intFileNum))
Line Input #intFileNum, strBuf
Text2.Text = Text2.Text & strBuf & vbCrLf
Loop
Close #intFileNum
MsgBox "よみこみおわり"
Else
MsgBox "Command1 を押してケロ"
End If
End Sub
Private Sub Form_Load()
Text1.Text = ""
Text2.Text = ""
End Sub
>Write #1, a,b,c,d,e,f,g
VB5以前ではアウツですが、Split関数というのがあります。(詳しくはヘルプなどで)
一旦くっつけてまとめて1行で読み書きし、後でバラすというのもアリかもしれません。
ありゃ、いつも間にかGS様のお答えが…。面目ないです。
編集 削除>最後の補足お願いします。
皆さんどうもです。
かなさんのコードで出来ましたが、なぜ出来るのかが分かりませんT_T;
そのため現在のコードに応用できません。
上のコードの重要な部分の簡単な説明して貰えないでしょうか、、
msdnライブラリで見ても簡単にしか書いてなくて分かんないです。
これとこれで文字の最後まで読み込む程度でよいので
上のソースの重要部分だけの説明お願いします。
カンマ区切りで保存して、読込時カンマで分割するだけで良いと思います。
Option Explicit
Private Sub Command1_Click()
Dim FNo As Integer
FNo = FreeFile
Open "c:\test.txt" For Output As #FNo
Print #FNo, Text1 & "," & Text2 'カンマ区切りで保存
Close #FNo
End Sub
Private Sub Command2_Click()
Dim FNo As Integer
Dim strBuf1 As String
Dim strBuf2() As String 'カンマ区切りで分割したデータを入れる配列を用意する
FNo = FreeFile
Open "c:\test.txt" For Input As #FNo
Line Input #FNo, strBuf1 '一行読み込む
strBuf2() = Split(strBuf1, ",") 'カンマ区切りで分割する
Text1 = strBuf2(0)
Text2 = strBuf2(1)
Close #FNo
End Sub
簡単に言えば、区切り文字(たとえばコンマ",")や囲み文字(データが数字か
文字かを区別するためにお題のようなダブルコーテーションで囲む)というのを
ある程度判別してデータを読み込んでくれるのが input 、
改行までまるまる1行読み込んでくれるのが line input です。
inputを使うとコンマやダブルコーテーションなどが文字データ内にある場合、
「余計な親切」で予期しない格納のされ方をする場合があります。
それをさけるために、「とりあえず1行まるごと読んで必要があれば
後でバラそう」という方が無難といえます。
テキストボックスでなく、リッチテキストを利用するとか、ユーザー定義型を
直接Put/Getするとか(コレもVB5以前はアウツですが)
読み書きのルールを決めるのは最終的には「用途による」ことになるので、
コレがベストというのはそれこそコードを書く方の腕の見せ所であり、
この場ではなんともいえせんが、少なくとも間際らしい特殊文字の存在があり得る
文字列データを含むデータ読み込みにinputを使うのはトラブルのモトともいえます。
あぅ、まごまごしている間に今度はしゅう様のお答えが。
編集 削除あっ、かなさんが言ってましたね。
編集 削除>皆さんどもです。
あれから色々やってみたのですが、Binaryを使うと ”などで
区切られないということで自分なりにやったのですが、今のところ
良い感じで出来ました。
Open "tesT.TXT" For Binary As #1
Put #1, , a
Close #1
Binaryを強く進められなかったので、デメリットがあるのかな??
と思いまして再度質問しております。
よろしくお願いいたします。
…すいません、私が知っているバイナリでの方法だと大体こんな感じです。
もっと簡単なのがあると思いますが…すみません、忘れました。
新しいクラスに貼り付けてください作成してください。
'■■■Class1に、ここから
'Binary で文字列をReadWriteするクラス
Option Explicit
Private UsingFileName As String
Private Sub Class_Initialize()
UsingFileName = vbNullString
End Sub
Public Property Get ReadWriteStream_FileName() As String
ReadWriteStream_FileName = UsingFileName
End Property
Public Property Let ReadWriteStream_FileName(ByVal NewValue As String)
UsingFileName = NewValue
End Property
Public Function ReadAll(ByRef return_StringArray() As Variant) As Long
Dim i As Long
Dim ff As Long
Dim buf() As Byte
Dim bufLength As Long
If UsingFileName <> vbNullString Then
ff = FreeFile()
Open UsingFileName For Binary As ff
Get #ff, 1, ReadAll
If ReadAll > 0 Then
ReDim return_StringArray(1 To ReadAll)
For i = 1 To ReadAll
Get #ff, , bufLength
If bufLength > 0 Then
ReDim buf(1 To bufLength)
Get #ff, , buf
return_StringArray(i) = buf
End If
Next
End If
Close ff
Else
ReadAll = 0
End If
End Function
Public Function WriteAll(ByRef write_StringArray() As Variant) As Long
Dim i As Long
Dim ff As Long
Dim buf() As Byte
Dim bufLength As Long
On Error GoTo WriteAll_Error:
WriteAll = UBound(write_StringArray) - LBound(write_StringArray) + 1
On Error GoTo 0
If UsingFileName <> vbNullString Then
On Error Resume Next
SetAttr UsingFileName, vbArchive
Kill UsingFileName
On Error GoTo 0
ff = FreeFile()
Open UsingFileName For Binary As ff
Put #ff, 1, WriteAll
For i = LBound(write_StringArray) To UBound(write_StringArray)
If write_StringArray(i) = vbNullString Then
Put #ff, , 0&
Else
buf = CStr(write_StringArray(i))
bufLength = UBound(buf) - LBound(buf) + 1
Put #ff, , bufLength
Put #ff, , buf
End If
Next
Close ff
Else
WriteAll = 0
End If
Exit Function
WriteAll_Error:
'エラーの場合は抜ける
WriteAll = 0
On Error GoTo 0
End Function
'■■■ここまで貼り付ける
以下はフォームにでも貼り付ける。
'■■■利用例
Public Sub main()
Dim x As New BinaryReadWriteClass
Dim va() As Variant
Dim v As Variant
va = Array("1: abcdefg" + """" + "abc" + """", _
"2: " + vbTab + """" + "this is tab." + """")
x.ReadWriteStream_FileName = "c:\1.bin"
x.WriteAll va
Erase va
x.ReadAll va
For Each v In va
MsgBox v
Next
End Sub