すみません、もうひとつ質問させてください。PC環境はWindowsXP,VB6.0です
コマンドボタンを押下後、DB.txtというテキストファイルをリストボックスに表示する、というプログラムを作成しています。
ファイルを1行1行読み込み、リストボックスに表示する際、strRecord(20)という
1次配列を使用したいのですが、
DB.txtというテキストファイルは文字列が26行あります。
strRecord(20)という1次配列を使用することで表示する文字列を20行目までにするにはどうしたらよいか、
どなたかご教授いただけないでしょうか…
データを一行ずつ要素(配列)に格納するということは配列に文字列&vbCrLfを代入して20回表示させればよいのではないかと思ったのですが、
ファイルを開いてデータを読み込む際にDo Until EOF(1)としてしまっているので何らかの条件をつけないとファイルの最後の26行目まで表示されます。
Dim openFile As String
Dim readData As String '読み込んだデータ
Dim temp As String '各行のデータを一時的に保持する変数
readData = ""
Open "C:\File\DB.txt" For Input As #1
Do Until EOF(1)
'データを1件(1行)ずつ読み込む
Line Input #1, temp
'読み込んだデータ(行)が「スペースのみ」か「改行のみ」の場合
If Trim$(temp) = "" Then
Exit Do 'ファイル読み込み終了
Else '文字列が存在する場合
'データを一行ずつ要素(配列)に格納する
strRecord(20) = temp & vbCrLf
'データをリストボックスに表示
list_Test.AddItem strRecord(20)
End If
Loop
↑何もわかってないとんちんかんなコードを書いていることと思いますが、
宜しくお願い致します。
> Open "C:\File\DB.txt" For Input As #1
#1のような、固定ファイルナンバーにすると、
他のところでバッティングが起こったりする可能性があるので
FreeFile()を使ってフリーのファイルナンバーを使った方がいい。
> Do Until EOF(1)
>
> 'データを1件(1行)ずつ読み込む
> Line Input #1, temp
>
> '読み込んだデータ(行)が「スペースのみ」か「改行のみ」の場合
つまり、空白行…と。
> If Trim$(temp) = "" Then
>
> Exit Do 'ファイル読み込み終了
>
> Else '文字列が存在する場合
>
> 'データを一行ずつ要素(配列)に格納する
> strRecord(20) = temp & vbCrLf
改行文字まで入れる必要は…必要が無いのなら、要らない。
またstrRecordの20番目の要素だけに入れても仕方が無いかと。
カウント変数などを用いて、代入先の要素のインデックスを管理するといいと思われ。
> 'データをリストボックスに表示
> list_Test.AddItem strRecord(20)
>
> End If
>
> Loop
あと、変数readDataが使われていない気がするな…
ガッさん、ご教授ありがとうございます。
Dim targetRec As Integer
Dim strRecord(20) As String 'データを格納する配列
For targetRec = 1 To 20 Step 1
'データを一行ずつ要素(配列)に格納する
strRecord(targetRec) = temp
'データをリストボックスに表示
list_Test.AddItem strRecord(targetRec)
Next targetRec
としてみたのですが、このコードで各行の文字列が20行ずつ26行分表示させてしまいました・・・
私はわかっていないことだらけですが、配列が特にわかっていないのでしょうか?
宣言部分でstrRecord(20)と記述したら要素数が20ということで、
それ以外の部分でstrRecord(20)と記述したら20番目の配列ということなのでしょうか???
VB勉強のためにはもっと違うプログラムの練習をしたほうがいいのでしょうか・・・・?
横から飛び入りします。ごめんなさい。
さて、VB3日目初心者さんの2回目のコードですが・・・。
これ、ファイル読んでる中で、一緒にやってます?
OpenからCloseまでの間に。
だとしたら、26行表示されます。
影さん、ご教授ありがとうございます。
私の書いたコードを載せます。
'変数の宣言
Dim openFile As String
Dim fileNum As Integer
Dim temp As String '各行のデータを一時的に保持する変数
Dim targetRec As Integer ’読み込んだ行をあらわす変数
Dim strRecord(20) As String 'データを格納する配列
'ファイルがディスクに存在するかどうかを調べる。
If Dir("C:\File\DB.txt") = "" Then
MsgBox "ファイルが読み込めません"
Else
'データの読み込み
readData = ""
fileNum = FreeFile
Open "C:\File\DB.txt" For Input As #fileNum
Do Until EOF(fileNum)
'データを1件(1行)ずつ読み込む
Line Input #fileNum, temp
'読み込んだデータ(行)が空白の場合
If Trim$(temp) = "" Then
Exit Do 'ファイル読み込み終了
End If
Loop
Close #1
For targetRec = 1 To 20 Step 1
'データを一行ずつ要素(配列)に格納する
strRecord(targetRec) = temp
'データをリストボックスに表示
list_Test.AddItem strRecord(targetRec)
Next targetRec
End If
End Sub
Closeの外に2回目のコードを移動して実行してみました。
結果は、テキストの最後の行が20回繰り返されていました・・・
for文なしで配列に格納して表示するだけだとlist_Test.AddItem strRecord(20)
とすればやはり最後の行しか表示されませんし…
せっかくコメントを頂いているのですがうまくいかせていません。
もう少しもがいてみます。
こんな感じでしょうか
Dim temp As String '各行のデータを一時的に保持する変数
Dim iFileNo As Integer
Dim targetRec As Integer
Dim strRecord(1 To 20) As String 'データを格納する配列
iFileNo = FreeFile
Open "C:\File\DB.txt" For Input As #iFileNo
targetRec = 1
Do Until EOF(iFileNo) Or targetRec > 20
'データを1件(1行)ずつ読み込む
Line Input #iFileNo, temp
'読み込んだデータ(行)が「スペースのみ」か「改行のみ」の場合
If Trim$(temp) = "" Then
Exit Do 'ファイル読み込み終了
Else '文字列が存在する場合
'データを一行ずつ要素(配列)に格納する
strRecord(targetRec) = temp
'データをリストボックスに表示
list_Test.AddItem temp
targetRec = targetRec + 1
End If
Loop
うーん・・・って見ていったら、下にサンプルが・・・。
読みやすいですなぁ・・・。
あれ? でも、別に配列じゃなくても良いのでは?
・・・あ、ごめんなさい m(_ _)m
あ、それと、2回目のコードです。
> readData = ""
エラー出ませんか?
LESIAさん、模範のコードをありがとうございました。
20行目までの文字列だけ取り出せました。
Do Loopの中にコードを書いているのだからtargetRec = targetRec + 1として
strRecord(targetRec) = temp
list_Test.AddItem temp
とすればよかったのですね。
「strRecord(20)という1次配列を使用」というのもただ直接strRecord(20) になにかを代入しただけでは、影さんの指摘のとおり、strRecordの20番目の要素だけに入れていることになるというのも理解できました。
別に配列じゃなくても良いのでは?出題者に聞いてみたのですが、ここでは配列を利用する意味がないが、使う練習だそうです。
そして、readDataという変数も不必要でしたね…。
ガッさん、影さん、LESIAさん、ご教授ありがとうございました。
大変勉強になりました。
教わるというか、代わりにといていただいたもドウゼン、恥ずかしいです。
時間をかけて修行します。
解決のチェック入れ忘れていました。
お世話になります。
VB3日目初心者さまとほとんど同じ内容の質問です。
まずは下記のコードをご覧ください。
Private Sub cmd_Fileread_Click()
'変数の宣言
Dim sData As String
Dim strRecord(1 To 20) As String
Dim TargetRec As Integer
'既存のファイルを開きます。
Open "C:\File\DB.txt" For Input As #1
'ファイルからデータを読み出します。
lst_Text.Clear
TargetRec = 1
Do Until EOF(1)
Line Input #1, sData
If sData = "" Then
Exit Do
End If
If Trim(sData) = "" Then
Exit Do
End If
'lst_Text.AddItem sData
strRecord(TargetRec) = sData
TargetRec = TargetRec + 1
If TargetRec > 20 Then
Exit Do
End If
Loop
'ファイルを閉じます。
Close #1
'カウンタとして使用する変数
Dim i As Integer
TargetRec = 0
For i = 1 To 20 Step 1
TargetRec = TargetRec + 1
Next i
lst_Text.AddItem strRecord() ←ここです
^^^^^^^^^^^^^^
'イベントを終了します。
Exit Sub
'エラー処理を行います。
FileReadError:
MsgBox "ファイルが読み込めません"
End Sub
strRecord()の部分をFor文の機能を使って20行ちゃんと表示させろという
指示なんですが、どうしてもうまくいきません。
どなたかご教示いただけないでしょうか?
どうもうまくいきませんの内容が知りたいところなのですが、
EOF(1)
これはまずいと思います。
#このスレッドは1年以上前に解決になっているスレッドなので
#新規で質問を投稿することをオススメ致します。
#その際、このスレッドのURLを記入し、参考にしたのですが。など
#書いて置くとよいかもしれません。
KGさま
ご指摘ありがとうございます。
逼迫していたため、配慮が足らずに申し訳ありませんでした。
新規にスレッドを立てて質問させていただきます。
その時にまたどうぞよろしくお願いします。
ツイート | ![]() |