VB 6.0より導入された、ファイル システム オブジェクトを使用しているのですが、読み込み時のファイルサイズ制限がマニュアルで見つけられませんでした。
読み込みファイルサイズがどの程度までエラーなく動作するのかがわかる方がいましたら、ご回答願います。
ちなみに、ファイルはテキストファイルを読み込もうとしております。

A 回答 (1件)

たぶん、文字変数の上限(2M Byte)



以下MSDNより引用

大きいファイルの場合は、ReadAll メソッドを使用すると、
メモリ リソースを消費する場合があります。
このようなファイルを入力するときは、
1 行ずつファイルを読み込むなどの工夫を行うとよいでしょう。

参考URL:http://www.microsoft.com/japan/developer/library …
    • good
    • 0
この回答へのお礼

あいまいな質問への回答ありがとうございます。
改行の入らないテキストの読み込みでしたので、参考URLより指定バイトの読み込みがあるとわかりました。
ありがとうございました。

お礼日時:2001/04/23 16:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QVB6.0 CSVファイル読み込みについて

VB6.0について質問です。
CSVファイルの読み込みを行いたいのですがうまくいきません。。。
以下のソースのどこに問題ありますでしょうか?><
14個のカンマ区切りのCSVファイルを読み込んでいますが
ファイルのデータを変更するとインデックスが有効範囲にありませんというエーラーがでます。。。
ファイルは3行で構成しているのですがヘルプを参照したら複数行の場合はLINE Input #1, MyString(i)と書いてありました。
しかしやってみると行ごとのデータを取得してカンマ区切りで取得してくれませんでした。。。
以下のソースで実行すると改行部でエラーになるようです。
改行を無視するようなロジックを入れる必要があるのでしょうか?

Dim MyString(), i
Open App.path & "\" & CSV_filename For Input As #1
ReDim MyString(13)
Do While Not eof(1)

Input #1, MyString(i)
Label4(i).caption = MyString(i)
i = i + 1
Loop
Close #1

VB6.0について質問です。
CSVファイルの読み込みを行いたいのですがうまくいきません。。。
以下のソースのどこに問題ありますでしょうか?><
14個のカンマ区切りのCSVファイルを読み込んでいますが
ファイルのデータを変更するとインデックスが有効範囲にありませんというエーラーがでます。。。
ファイルは3行で構成しているのですがヘルプを参照したら複数行の場合はLINE Input #1, MyString(i)と書いてありました。
しかしやってみると行ごとのデータを取得してカンマ区切りで取得してくれませんでし...続きを読む

Aベストアンサー

CSVファイルを列数は固定で、カンマで区切られていて複数行あるものとします。(一般的な概念)

●必ず列が5個(カンマが4個)の一行が複数行ある場合

Dim MyString() as String
Dim i , j as Integer

Open App.path & "\" & CSV_filename For Input As #1
Do until EOF(1)
i = i + 1 ''行数を先に数えます
Loop

Redim MyString(i , 5) as String ''行数×列数分変数を初期化します

for j = 1 to i
Input #1, MyString(j,1),MyString(j,2),MyString(j,3),MyString(j,4),MyString(j,5)
Next j

Close #1

Debug.Print "2行目の3列目=" & MyString(2,3)


●必ず列が5個(カンマが4個)の3行一組が複数セットある場合

for j = 1 to i / 3
Input #1, MyString(j,1),MyString(j,2),MyString(j,3),MyString(j,4),MyString(j,5)
Input #1, MyString(j,6),MyString(j,7),MyString(j,8),MyString(j,9),MyString(j,10)
Input #1, MyString(j,11),MyString(j,12),MyString(j,13),MyString(j,14),MyString(j,15)
Next j


★ご質問の中の問題点
1.「データを変更すると」
→列数は変更してはいけません(カンマの数は必ず同数)
2.「LintInput」
→Inputは行毎・列毎に値を取得します。LineInputは一行をひとつの値として値を取得します。
3.「ReDim MyString(13)」
→上記設定ですと変数は14個分ですが、カンマが14個ということは15個の変数が必要です
「Redim MyString(14)または(1 to 15)」となります
4.「Input #1, MyString(i)」
→列が15個あるのに一回のループで1個ずつしか値が取れません
セル番号で表すと、
MyString(1) = "A1"
MyString(2) = "B1"
MyString(3) = "C1" となってしまいます。
つまり、行数に関わらず、14個までしか値の取得はできません。

長文にも関わらず的確でなくてすいません。
CSVファイルのイメージをご提示いただけるとサンプルソースが作りやすいと思います。

例)CSVファイルで列数は固定、行数は可変で各行の3番目の値を表示したい etc.
A1,B1,C1,D1,E1
A2,B2,C2,D2,E2
A3,B3,C3,D3,E3

例)CSVファイルで列数は可変、行数は可変でn番目の値を表示したい etc.
A1,B1,C1
A2,B2,C2,D2,E2
A3,B3,C3,D3

CSVファイルを列数は固定で、カンマで区切られていて複数行あるものとします。(一般的な概念)

●必ず列が5個(カンマが4個)の一行が複数行ある場合

Dim MyString() as String
Dim i , j as Integer

Open App.path & "\" & CSV_filename For Input As #1
Do until EOF(1)
i = i + 1 ''行数を先に数えます
Loop

Redim MyString(i , 5) as String ''行数×列数分変数を初期化します

for j = 1 to i
Input #1, MyString(j,1),MyString(j,2),MyString(j,3),MyString(j,4),MyStr...続きを読む

QVB6.0 sp5]テキストボックスと保存・読み込み

どもです。お願いします。

text1 ~ text15まであります。
multiline = trueですが一行のみです。

text1 ~ text4くらいまでに文字を入れて
保存を押します。

a = text1.text
b = text2.text
c = text3.text
d = text4.text
 ・(以下省略)
   ・
   ・
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
text3.text = c
 ・(以下省略)
  ・
  ・
a = "あいうえお" b = "かきくけこ"
と入っている場合、読み込んだときに
text1 に「あいうえお」 と入るはずなのですが

text1に 「あい」 text2に 「うえお」 text3に「かき」 text4に「く」 text5に「けこ」な感じで
何も入っていないテキストまでにも文字が分解されて入っていきます。

文字数の指定もしていないし、マルチラインもtrueなのであと原因がわからないですT_T;

もしや・・・と言うのでもよいので助けてください。

どもです。お願いします。

text1 ~ text15まであります。
multiline = trueですが一行のみです。

text1 ~ text4くらいまでに文字を入れて
保存を押します。

a = text1.text
b = text2.text
c = text3.text
d = text4.text
 ・(以下省略)
   ・
   ・
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
te...続きを読む

Aベストアンサー

#1,#2のものですが、シーケンシャルファイルを使わずに、データコントロールを使ってmdbファイルを使うというのもひとつの手です。
そうすれば、記号の件は回避できると思います。

Qvb6.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;

Aベストアンサー

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

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

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

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

Put,Get, 関係を使うのであれば.バイナリダンプ・バイナリ編集あたりのフリーソフトでもかき集めて.書式とコードが使えるか.つまり.過去のルーチンが吐き出す内容と書式・コードが一致するかを調べる必要があります。
2つの読み取りルーチンを紹介したのは.改行コードの問題から.どちらが読み...続きを読む

QVB6.0でINIファイルからデータを読み込みたいです

INIファイルからPCのモニターとフォームサイズデータの比率を読み込み、そのデータを元にフォームを画面を呼び出したいのですが、どの様にしてよいかがわかりません。申し訳ありませんが教えていただけないでしょうか??
ちなみにINIファイルのデータを読み込み、ボタンに名前を表示するといったことはできました。

Aベストアンサー

フォームサイズは、そのフォームのScaleWidthやScaleHeightプロパティで取得することができますよね。
ディスプレイサイズ(解像度)は、以下のようなAPI関数を使って取得できますので(X=1280, Y=800等のピクセル値)、両者の値から行いたい値を算出して、フォームの前述のプロパティを変更すれば良いのではないでしょうか。

Option Explicit
Private Declare Function GetSystemMetrics Lib "user32" _
      (ByVal nIndex As Long) As Long
Private Const SM_CXSCREEN As Long = 0
Private Const SM_CYSCREEN As Long = 1
Private Sub Form_Load()
  Dim X As Long, Y As Long
  X = GetSystemMetrics(SM_CXSCREEN) '画面の幅を取得します。
  Y = GetSystemMetrics(SM_CYSCREEN) '画面の高さを取得します。
  Debug.Print X, Y
End Sub
注)ステートメントを見易くするため先頭に全角スペースを入れてます。
 

フォームサイズは、そのフォームのScaleWidthやScaleHeightプロパティで取得することができますよね。
ディスプレイサイズ(解像度)は、以下のようなAPI関数を使って取得できますので(X=1280, Y=800等のピクセル値)、両者の値から行いたい値を算出して、フォームの前述のプロパティを変更すれば良いのではないでしょうか。

Option Explicit
Private Declare Function GetSystemMetrics Lib "user32" _
      (ByVal nIndex As Long) As Long
Private Const SM_CXSCREEN As Long = 0
Private Const SM...続きを読む

Q【VB6.0】ファイルからサイズの大きいバイナリデータを読み込む際にエラー

はじめまして。
初投稿の新米プログラマです。

VB6.0で多種類のファイルをバイナリデータとして読み込んで
返却する関数を作成しています。

'-------------------------------------
' ファイルからバイナリデータを読み込む
'-------------------------------------
private Function GetBinaryData(ByVal strFileName As String) As Byte()
On Error GoTo Exception

Dim fileNo As Integer
Dim fileSize As Long
Dim bytData() As Byte

'ファイルのサイズを取得する
fileSize = FileLen(strFileName)
ReDim bytData(fileSize - 1)

'バイナリデータ読み込み
fileNo = FreeFile
Open strFileName For Binary Access Read As fileNo
Get #fileNo, , bytData
Close #fileNo

'戻り値の設定
GetBinaryData = bytData
Exit Function

'エラー処理
Exception:
MsgBox (CStr(Err.Number) & " " & Err.Description)

End Function

ですが、↑の関数にサイズの大きなファイル(100M程度)を指定したとき
 ReDim bytData(fileSize)
で、「メモリが不足しています」というエラーが発生してしまいます。

発生の仕方としては、'エラー処理のMsgBoxで表示されることも
ありますし、プログラムが停止することもありますし、
On Error GoToを記述しているのにも関わらず
VBのメッセージボックスが表示されることもあります。
 #[継続][終了][デバッグ][ヘルプ]のボタンが出ているやつです。

ちなみに、50M程度のファイルであれば読み込めています。

このエラーが発生する原因は何なのでしょうか?
また、解決方法(サイズの大きなファイルを確実に読み込む方法)は
あるのでしょうか?
解決方法がないのであれば、「○M以上のファイルはエラー」という
仕様にしようと思うのですが、
何Mまでなら確実に読み込むことが出来るのでしょうか?

…もしくは上のコーディング自体、検討違いでしょうか^^;
 #バイト配列の要素数に上限があるとか…?

とても困っています…
どうかよろしくお願い致します。

はじめまして。
初投稿の新米プログラマです。

VB6.0で多種類のファイルをバイナリデータとして読み込んで
返却する関数を作成しています。

'-------------------------------------
' ファイルからバイナリデータを読み込む
'-------------------------------------
private Function GetBinaryData(ByVal strFileName As String) As Byte()
On Error GoTo Exception

Dim fileNo As Integer
Dim fileSize As Long
Dim bytData() As Byte

'ファイルのサイズを取得する
f...続きを読む

Aベストアンサー

実行環境に依存するようにも思えます

当方で単に確保するのみの確認したところでは ReDimで340MB程度は確保できるようでした
関数が配列を返す場合一時的に内部で使用しているローカル変数と呼び出し元の受け手の配列の2つ領域で同じ大きさの配列が必要になると思われます

ファイルの読み込みを 1度にしないといけないのでしょうか
50MB程度のバッファを用意して読み込み、必要な処理を行い
次ブロックを読み込んで、必要な処理
といったループを組めば済むように感じます

終端処理のため処理したByte数の管理は必要でしょうが …
LOF関数やLOC関数などを使って残りがいくつあるかは確認可能です


人気Q&Aランキング

おすすめ情報