配列1要素に一行分の文字列を入れるには?

解決


VB3日目初心者  2005-02-08 23:01:58  No: 88330

すみません、もうひとつ質問させてください。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
↑何もわかってないとんちんかんなコードを書いていることと思いますが、
宜しくお願い致します。


ガッ  2005-02-08 23:18:55  No: 88331

>  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が使われていない気がするな…


VB3日目初心者  2005-02-08 23:48:41  No: 88332

ガッさん、ご教授ありがとうございます。

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勉強のためにはもっと違うプログラムの練習をしたほうがいいのでしょうか・・・・?


  2005-02-08 23:59:51  No: 88333

横から飛び入りします。ごめんなさい。

さて、VB3日目初心者さんの2回目のコードですが・・・。

これ、ファイル読んでる中で、一緒にやってます?
OpenからCloseまでの間に。
だとしたら、26行表示されます。


VB3日目初心者  2005-02-09 00:25:29  No: 88334

影さん、ご教授ありがとうございます。

私の書いたコードを載せます。

'変数の宣言
    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)
とすればやはり最後の行しか表示されませんし…

せっかくコメントを頂いているのですがうまくいかせていません。
もう少しもがいてみます。


LESIA  2005-02-09 00:26:24  No: 88335

こんな感じでしょうか

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


  2005-02-09 00:41:55  No: 88336

うーん・・・って見ていったら、下にサンプルが・・・。
読みやすいですなぁ・・・。

あれ?  でも、別に配列じゃなくても良いのでは?
・・・あ、ごめんなさい m(_ _)m

あ、それと、2回目のコードです。
> readData = ""
エラー出ませんか?


VB3日目初心者  2005-02-09 01:32:43  No: 88337

LESIAさん、模範のコードをありがとうございました。
20行目までの文字列だけ取り出せました。
Do Loopの中にコードを書いているのだからtargetRec = targetRec + 1として
strRecord(targetRec) = temp 
list_Test.AddItem temp
とすればよかったのですね。

「strRecord(20)という1次配列を使用」というのもただ直接strRecord(20) になにかを代入しただけでは、影さんの指摘のとおり、strRecordの20番目の要素だけに入れていることになるというのも理解できました。
別に配列じゃなくても良いのでは?出題者に聞いてみたのですが、ここでは配列を利用する意味がないが、使う練習だそうです。
そして、readDataという変数も不必要でしたね…。

ガッさん、影さん、LESIAさん、ご教授ありがとうございました。
大変勉強になりました。
教わるというか、代わりにといていただいたもドウゼン、恥ずかしいです。
時間をかけて修行します。


VB3日目初心者  2005-02-09 02:15:58  No: 88338

解決のチェック入れ忘れていました。


ゆう  2006-10-24 03:43:18  No: 88339

お世話になります。
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行ちゃんと表示させろという
指示なんですが、どうしてもうまくいきません。
どなたかご教示いただけないでしょうか?


KG  2006-10-24 06:33:24  No: 88340

どうもうまくいきませんの内容が知りたいところなのですが、

EOF(1)

これはまずいと思います。

#このスレッドは1年以上前に解決になっているスレッドなので
#新規で質問を投稿することをオススメ致します。
#その際、このスレッドのURLを記入し、参考にしたのですが。など
#書いて置くとよいかもしれません。


ゆう  2006-10-25 01:51:20  No: 88341

KGさま

ご指摘ありがとうございます。
逼迫していたため、配慮が足らずに申し訳ありませんでした。
新規にスレッドを立てて質問させていただきます。
その時にまたどうぞよろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加