バッファからファイルに、データを書きます。
構文:
用法:
Put #filenum, position, data [, amount]
varres = Put (#filenum, position, data [, amount])
パラメタ:
filenum
position
position は、ファイルで、Put を始める位置です。
ファイルを、For Random で開いたら、record で位置を与えます。それ以外なら、バイトで、位置を与えます。
位置を省略すると、現在のファイル・ポインタの位置から書き始めます。
位置は1を起点としています:
すなわち、ファイルの先頭レコードか先頭バイトが、位置 1 になります。
position が省略されるか、または、ゼロ(0)なら、ファイルの書き始めは、現在のファイル位置からになります。
data
data は、データが書き込まれるバッファです。数値変数、文字列、配列、ユーザ定義型(
This で参照されるものを含む)が可能です。操作では、
amount が指定されない限り、変数全体をディスクに転送しようとします。ユーザ定義型のインスタンスの場合、影響を受けるデータは非静的なデータ・メンバのみです。
配列を
Put するきは、
data の後に空の大括弧 '
()' を付けなければなりません。
Put は配列の全データを書き込みます。
amount は許可されていません。
文字列(
String)を
Put する場合、書き込むバイト数は、文字列データのバイト数と同じです。
amount は許可されていません。
注意:
バッファから値を書くとき、pointerをバッファに渡してはいけません。
代わりに、バッファの最初の変数を渡さなければなりません。
(これは、
演算子 * (Value of)で、ポインターを逆参照することによって、行います。)
直接 pointer を渡すと、
Put は、ポインターが示すメモリではなく、ポインタ変数からメモリを置くでしょう。
amount
Put は、
amount だけ連続した変数を、ファイルに書きます。
すなわち、メモリで
data の場所で始まる、データの
( amount * Sizeof(data) )バイトを、ファイルに書きます。
amount を省略すると、それは、デフォルトの
1 になります。つまり、
Put が、ただ一つの変数を書くことを意味します。
戻り値:
Put() は、32ビット
Long を返します:成功すると
0 を返します。 エラーの時はゼロではありません。
"disk full(ディスク満杯)" はエラーとみなされ、戻りコード
3 が返されます。
以前に書き込まれた "正確" なデータ量は利用できず、まったく役に立たないでしょう。
記述:
Put は、関数として使用できます。成功の場合は 0 を、失敗の場合はエラーコードを返します。
ファイルを、
Random モードで開くときは、書くためのデータの、バイト表現のサイズは、指定したレコード・サイズに合わせなければなりません。
注意:
- 実際の [w/z]string 変数を Put に渡すとき、文字列を渡すときと同様に amount パラメータを禁止する必要があります。
使用しないこと、さもないと、ファイルに書き込む文字列の長さを乗算するために使われますが、提供された [w/z]string バッファの外側にオーバーフローする可能性があり、危険なものです。
- 逆参照された [w/z]string ポインターを Put に渡すとき、逆参照された数値ポインターを渡すときのように、amount パラメーターは考慮されません。
使用しないでください。ただし、amount パラメーターは尊重されずに、指定されたバッファーは、ゼロ要素(除外される端末要素)までファイルに書き込まれます。
- より細かくするために、最初の数値要素と、処理される数値要素の数を指定することにより、任意の [w/z]string 変数を数値バッファーとして Put に安全に渡すことができます。
最初の数値要素には、インデックス付けされた [w/z]string 変数、または逆参照された [w/z]string ポインタがインデックス付けされます。
例:
' ファイル番号のための変数と、置く数をつくります
Dim As Integer f
Dim As Long value
' 最初の空いているファイルのファイル番号を見つけます。
f = FreeFile()
' ファイル番号「f」を使って、2進の用法のために "file.ext" というファイルを開きます。
Open "file.ext" For Binary As #f
value= 10
' ファイルに、整数 'value' のバイトを書きます。ファイル番号「f」を使います。
' 書き始めは,ファイル (position 1) の頭です。
Put #f, 1, value
' ファイルを閉じます。
Close #f
' 整数配列を作ります。
Dim buffer
(1 To 10) As Integer
For i
As Integer =
1 To 10
buffer
(i
) = i
Next
' 最初の空いているファイルのファイル番号を見つけます。
Dim f
As Integer
f =
FreeFile()
' ファイル番号「f」を使って、2進の用法のために"file.ext"というファイルを開きます。
Open "file.ext" For Binary As #f
' ファイルに、配列を書きます。ファイル番号「f」を使います。
' 書き始めは,ファイル (position 1) の頭です。
Put #f,
1, buffer
()
' ファイルを閉じます。
Close #f
例:
Dim As Byte Ptr lpBuffer
Dim As Integer hFile, Counter, Size
Size =
256
lpBuffer =
Allocate(Size
)
For Counter =
0 To Size-
1
lpBuffer
[Counter
] =
(Counter
And &HFF
)
Next
' 空いているファイルのファイル番号を見つけます。
hFile =
FreeFile()
' バイナリ書き出しモードで、"test.bin"というファイルを開きます。
Open "test.bin" For Binary Access Write As #hFile
' lpBuffer によって、ポイントされたメモリから、256バイトを書きます。
Put #hFile, , lpBuffer
[0], Size
' ファイルを閉じます。
Close #hFile
' 割り当てられたメモリを解放します。
Deallocate lpBuffer
' 「THIS」は、UDT インスタンスのすべての非静的データをファイルに/から書き込むための引数として使えます。
Type UDT
Dim As String * 32 s
Dim As Double d
Declare Sub Save(ByRef filename As String)
Declare Sub Load(ByRef filename As String)
End Type
Sub UDT.Save(ByRef filename As String)
Dim As Integer f
f = FreeFile()
Open filename For Binary As #f
Put #f, , This '' writes all non-static data of the UDT instance to the file
Close #f
End Sub
Sub UDT.Load(ByRef filename As String)
Dim As Integer f
f = FreeFile()
Open filename For Binary As #f
Get #f, , This '' fills all non-static data of the UDT instance from the file
Close #f
End Sub
Dim As UDT u1
u1.s = "PI number"
u1.d = 3.14159
u1.Save("file.ext")
Dim As UDT u2
u2.Load("file.ext")
Print u2.s
Print u2.d
QBからの違い:
-
Put は、VB のように、配列全体を書くことができます。あるいは、buffer の記憶域から、データ・サイズの倍数を書くことができます。
-
Put は、FB で、関数として使えます。エラー処理手続きを用いなくても、戻り値で、成功/エラーのコードがわかります。
参照: