OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

ファイルの読み込み

  • 暇なときにでも
  • 質問No.169686
  • 閲覧数221
  • ありがとう数2
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 35% (35/99)

タイピングソフトを作っています。

メインのフォーム(タイピング画面)に
配列wk1(99)(ローマ字用)、wk2(99)(日本語)を宣言してます。

まだ初級しか作成してないでメインフォーム(タイピング画面)で

Private sub Yomikomi()
wk1(0)="hudebako",wk(0)="筆箱"
wk1(1)="pasokonn",wk(1)="パソコン"

wk1(99)="neko",wk(99)="ネコ"
End sub
という感じで100個読み込ませてます。

初級だけならよいのですが、その他に中級、上級の2つを準備したいのです。

そうなるとメインのプログラムがとても長くなってしまうので
syokyuu,tyuukyuu,jyoukyuuというファイル名で3つのファイルを
テキストファイルか何かで準備して
メインフォームでそのファイル(指定したファイル)を読み込んで
wk1,wk2に計100個保存したいのです。


そういう場合はどのように設定すればよいですか(読み込んで保存すること)?
準備するファイルはテキストファイルでもいいのでしょうか?
またその中身の記述はどうすればよいですか?

長くなりましたがよろしくお願いします。
通報する
  • 回答数3
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.3
レベル12

ベストアンサー率 65% (276/422)

確かにこの場合配列を固定させるのは望ましくないかもしれません。

初級/中級/上級の違いは、[主に読み込みファイル/読み込んだデータを収納する変数]が違うだけで、[読み込み方/読み込んだデータを収める方法]は同じはずです。
違う部分をパラメータで切り分け、共通関数を使用すべきです。



サンプルです。

処理内容としては
1.プログラムで使用するテキストファイルの宣言
2.テキストファイルの各問題の区切り文字を宣言
3.各問題を読み込む
4.ファイルサイズを得る
5.ファイルサイズの領域を文字列にセットする
6.テキストを取得する
7.文字列を2で設定した文字で区切り配列にセットする(wk1/wk2/wk3に返す値になる)
8.読み込んだデータ件数を表示
です。

主な関数
※FreeFile
Open "FileNeme1" For Input As #1
  Open "FileNeme1" For Input As #2
  Close #2
Close #1
このようなファイル番号#1/2などをプログラムで固定で直打ちをしないでも、空き番号が取得できます。重複する事がないので、バグ回避にもつながります。
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctfreefile.htm

※Split
引数1の文字列を、引数2の文字列にて区切ります。サンプルプログラムでは
Const CUT_STR As String = vbLf
として改行コードで区切られています。よって、行数の分だけの問題数となります。またvbLfを","などに変更すると、カンマ区切りで配列を創生します。
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctsplit.htm

※Ubound
配列要素の最大値を得る事ができます。ちなみにLboundは配列要素の最小値を得ます。
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctubound.htm
http://www.microsoft.com/JAPAN/developer/library/Vbenlr98/vafctuboundx.htm


FreeFileの使用方法を尋ねていたので参考までに書いたけど、各関数の上にカーソルがある状態でファンクションキーF1を押すと、関連ヘルプ(MSDN)を表示します。各関数はできるだけ調べるように努力しましょう。
もしMSDNがインストールされていない場合、
http://www.microsoft.com/japan/developer/default.asp
にオンラインMSDNがありますので、そちらで検索をしましょう。

Sub Main()
  '問題ファイル(1)
  Const TEST1 As String = "c:\syokyuu.txt"
  Const TEST2 As String = "c:\tyuukyuu.txt"
  Const TEST3 As String = "c:\jyoukyuu.txt"
  
  '問題の区切り(改行区切り)(2)
  Const CUT_STR As String = vbLf
  
  Dim wk1 As Variant     '初級
  Dim wk2 As Variant     '中級
  Dim wk3 As Variant     '上級
  
  '問題ファイルの読み込み(3)
  If Not subTestRead(TEST1, CUT_STR, wk1) Then
    Call MsgBox("[" & TEST1 & "]失敗")
    GoTo PGMEND
  End If
  If Not subTestRead(TEST2, CUT_STR, wk2) Then
    Call MsgBox("[" & TEST2 & "]失敗")
    GoTo PGMEND
  End If
  If Not subTestRead(TEST3, CUT_STR, wk3) Then
    Call MsgBox("[" & TEST3 & "]失敗")
    GoTo PGMEND
  End If
  
  '読み込んだ情報をメッセージボックスで出力(8)
  Call MsgBox( _
    "[" & TEST1 & "]は" & UBound(wk1) + 1 & "問のの問題があります" & vbNewLine _
    & "[" & TEST2 & "]は" & UBound(wk2) + 1 & "問のの問題があります" & vbNewLine _
    & "[" & TEST3 & "]は" & UBound(wk3) + 1 & "問のの問題があります" _
    )
PGMEND:
End Sub

'テキストファイルを読み込み、配列にして返す
'パラメータ1:ファイルパス
'パラメータ2:テキストファイルは何区切り?
'パラメータ3:返す配列
Public Function subTestRead(inFilePath As String, strCut As String, outTestAry As Variant) As Boolean
  Dim lngFileSize As Long 'ファイルサイズ
  Dim lngFileNum As Long 'ファイルナンバ
  
  Dim strBuff   As String  '文字列ワーク
  
  'ファイルサイズの取得(4)
  On Error Resume Next
  lngFileSize = FileLen(inFilePath)
  On Error GoTo 0
  'サイズが取得できない時NG処理
  If lngFileSize < 1 Then
    Exit Function
  End If
  
  '取得するためのサイズを用意(5)
  strBuff = String(lngFileSize, vbNullChar)
 
  'テキスト取得(6)
  lngFileNum = FreeFile
  Open inFilePath For Binary As #lngFileNum
    Get #lngFileNum, , strBuff
  Close #lngFileNum
  
  '文字列を区切り、配列に変換(7)
  outTestAry = Split(strBuff, strCut)
  
  'OKを記す
  subTestRead = True
End Function
お礼コメント
sakky_t

お礼率 35% (35/99)

くわしくありがとうございました。
むずかしいことばっかで理解するのがかなり大変ですが
なんとかがんばってみます。

ただ、どうしても
ファイルにこれ以上データが存在しません。
というエラーがわからないんですよ・・・。
投稿日時 - 2001-11-19 12:14:42
-PR-
-PR-

その他の回答 (全2件)

  • 回答No.1
レベル12

ベストアンサー率 45% (207/457)

例えば初級ファイルの中身は "hudebako","筆箱" "pasokonn","パソコン" ~ "neko","猫" とします。 ファイルを読み込むときは input関数を使います。 例えば Private Sub Command1_Click( ...続きを読む
例えば初級ファイルの中身は

"hudebako","筆箱"
"pasokonn","パソコン"

"neko","猫"

とします。
ファイルを読み込むときは
input関数を使います。

例えば

Private Sub Command1_Click()
Dim FlNum as Integer
Dim i as Integer

FlNum = FreeFile
Open "ファイル名" For Input As FlNum

i = 0
Do While Not EOF(FlNum)
Input #FlNum, wk1(i),wk(i)
i = i + 1
Loop
Close FlNum
End Sub

各関数はヘルプを見て確認して下さい。
補足コメント
sakky_t

お礼率 35% (35/99)

試しにやってみたのですが
ファイルにこれ以上データがありませんと
input~
のところでエラーが出てしまいます。

配列をintger→long
配列の数を100→110
といろいろとやってみたのですが
エラーが解除できません。
このエラーの原因は何でしょうか?
ブレイクポイントを設定してみると
どうやらi=97で止まるみたいです。

あと"FlNum = FreeFile "とはどういう意味なんでしょうか?
FreeFileっていうのがいまいちわかりません。
投稿日時 - 2001-11-17 20:03:25


  • 回答No.2
レベル14

ベストアンサー率 28% (4323/15250)

先にご解答の方に補足させていただきます。 データをプログラムの中の配列で発生・定義するのは、 初等の解説書に載っていますが、レコード数が増えたり、 別種のデータで処理したいとき、ソースプログラムをいじらなければならなくなるので勧められません。早く卒業する事です。 そこで、ファイルを作りそれに記録するのです。 これが、コンピュータプログラムが発達し始め、COBOLなどの時代になると、主流になりまし ...続きを読む
先にご解答の方に補足させていただきます。
データをプログラムの中の配列で発生・定義するのは、
初等の解説書に載っていますが、レコード数が増えたり、
別種のデータで処理したいとき、ソースプログラムをいじらなければならなくなるので勧められません。早く卒業する事です。
そこで、ファイルを作りそれに記録するのです。
これが、コンピュータプログラムが発達し始め、COBOLなどの時代になると、主流になりました。
ファイル(データ)とプログラムの分離です。
ファイルを処理する為には、ファイルが存在しなければなりません。自分で作るわけです。どうして作るか。
  (1)VBで作る。JAVAでも出きれば良いでしょ     う。入力を受けつけるプログラムで作る
  (2)エクセルでセルにデータを入力して作り、CS    V形式で保存する。
  (3)メモ帳で作る。
  (4)その外に他人が作ったデータを処理することも
    当然多い。
(2)はファイル-名前をつけて保存-ファイルの種類を
CSV(カンマ区切り)を指定して「保存」する-ファイル名を仮にBook1.csvとする。これを読むにはVBで
Private Sub Form_Click()
Open "c:\My Documents\Book1.csv" For Input As #1
If EOF(1)=-1 Then GoTo p2
p1:
Input #1, a$, b$
Form1.Print a$, b$ '(表示の例)
'(処理がここに入る)
GoTo p1
p2:
close #1
End Sub
--------------
(1)で作るには
Private Sub Form_Click()
Open "c:\My Documents\Book2.csv" For output As #1
p1:
a$=InputBox("a=")
if a$="end" then goto p2
b$=InputBox("b=")
Print #1,a$;","; b$(2項目の例)
GoTo p1
p2:
close #1
End Sub
上記がシーケンシャルファイルと言われるものです。
(どちらもGOTO文があり、旧BASICの色を残す拙いプログラムで済みません。)
将来ぜひファイルに「構造」を持たせることを学んで
ください。本当に面白い分野と思います。
お礼コメント
sakky_t

お礼率 35% (35/99)

回答ありがとうございます

たしかにファイルの構造はやってて楽しいです。
ただエラーが出るのだけは苦労しますけど・・・。
なんにでもエラーはつきのもですもんね。

がんばってエラーをなくすようがんばってみます。
投稿日時 - 2001-11-19 12:17:03
このQ&Aのテーマ
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ