DOBON.NET DOBON.NETプログラミング掲示板過去ログ

バイナリーファイル書き込み

環境/言語:[WindowsXP C#]
分類:[.NET]

現在、C#にて開発を行っているのですが、
構造体のデータをバイナリーファイルに書き込む方法がわからなく困っています。
C言語のwrite関数のようなものは無いのでしょうか?

また、構造体のデータをバイナリーファイルに書き込む方法をご存じの方、ご教授願います。

以上、宜しくお願いします。
BinaryWriterを使って、forで回せばよいのでは?
レスありがとうございます。

引数に構造体を渡して一括で書き込む事は、やっぱり無理なのでしょうか?
構造体配列で数十万件あるもので・・・。
■No11659に返信(めぐさんの記事)
> レスありがとうございます。
>
> 引数に構造体を渡して一括で書き込む事は、やっぱり無理なのでしょうか?
> 構造体配列で数十万件あるもので・・・。
>

DOBON.NET > プログラミング道 > .NET Tips > ファイル、フォルダ
オブジェクトの内容をバイナリファイルに保存する http://dobon.net/vb/dotnet/file/binaryformatter.html

方法はどうでしょうか。
■No11666に返信(ポンさんの記事)
> DOBON.NET > プログラミング道 > .NET Tips > ファイル、フォルダ
> オブジェクトの内容をバイナリファイルに保存する http://dobon.net/vb/dotnet/file/binaryformatter.html
>
> 方法はどうでしょうか。

レスありがとうございます。
試してみましたが、先頭部にヘッダーにたいな情報が書き込まれており、
stringの先頭に文字数が書かれており、使用できません。
どんな方法でもいいので、int,string[10]で、14byteのファイルを作成する方法は
無いのでしょうか?
> レスありがとうございます。
> 試してみましたが、先頭部にヘッダーにたいな情報が書き込まれており、
> stringの先頭に文字数が書かれており、使用できません。
> どんな方法でもいいので、int,string[10]で、14byteのファイルを作成する方法は
> 無いのでしょうか?
>


ポンは、C言語はよくわからないのですが、string[10]ってところは、Byte型配列にしないと思うのですが...

string を Byte型配列にして、読み書きするのは、こんな感じになります。(VBのコードですみません)


<Serializable()> _
Public Class TestClass
Private _message(9) As Byte
Private _number As Integer
Private sjisEnc As System.Text.Encoding

Public Property Message() As String
Get
sjisEnc = System.Text.Encoding.GetEncoding("Shift_JIS")
Return sjisEnc.GetString(_message)
End Get
Set(ByVal Value As String)
sjisEnc = System.Text.Encoding.GetEncoding("Shift_JIS")
_message = sjisEnc.GetBytes(Value)
ReDim Preserve _message(9)
End Set
End Property

Public Property Number() As Integer
Get
Return _number
End Get
Set(ByVal Value As Integer)
_number = Value
End Set
End Property

Public Sub New(ByVal str As String, ByVal num As Integer)
sjisEnc = System.Text.Encoding.GetEncoding("Shift_JIS")
_message = sjisEnc.GetBytes(str)
ReDim Preserve _message(9)
_number = num
End Sub
End Class


'書き込み
Dim fileName As String = "C:\test.obj"
Dim i As Integer

Dim obj1 As TestClass
Dim fs As New FileStream(fileName, FileMode.Create, FileAccess.Write)
Dim bf As New BinaryFormatter

For i = 0 To 99
obj1 = New TestClass("テストです。", i)
bf.Serialize(fs, obj1)
Next

fs.Close()

'読み込み
Dim fileName As String = "C:\test.obj"
Dim i As Integer
Dim obj1 As TestClass
Dim fs As New FileStream(fileName, FileMode.Open, FileAccess.Read)
Dim f As New BinaryFormatter

For i = 0 To 99
obj1 = CType(f.Deserialize(fs), TestClass)
Console.WriteLine(obj1.Number.ToString + "," + obj1.Message)
Next
fs.Close()

# BinaryWriterを使ってふつうに読み書きするのに比べて、かなり遅いです。
> 引数に構造体を渡して一括で書き込む事は、やっぱり無理なのでしょうか?
> 構造体配列で数十万件あるもので・・・。

こんにちは。

ドトールさんの方法では時間がかかりすぎるのでしょうか?
BinaryWriterは内部でバッファを用意して書き込んでいますので、
数十万件でしたら、それほどとは思うのですが…。

DOBON.NET | プログラミング道 | プログラミング掲示板