C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[5]: バイナリファイルから文字列取得


(過去ログ 94 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■56319 / inTopicNo.1)  バイナリファイルから文字列取得
  
□投稿者/ あや (1回)-(2011/01/10(Mon) 13:27:04)

分類:[C#] 

Windows XP
Visual studio 2005
C#
で開発しています。

バイナリファイルに
No(long型)
日付(long型(110101という形式))
住所(string型(\0で終了の可変長))
が書き込まれています。
それを読み出したいです。

Noと日付は

BinaryReader br = new BinaryReader(File.Open(file_name, FileMode.Open));
long no = br.ReadInt64();
long day = br.ReadInt64();

で読み出せています。
MesseageBox.Showで確認済み。

問題なのが住所で、
\0で終わる可変長文字列を読み出したいのですが、
可能でしょうか?
調べてみたのですが
string address = br.ReadString();
では読み出せませんでした。
文字列の先頭に長さを付け、7ビットの整数としてまとめてエンコードします。
というのがよくわかりませんでした...。

ちなみに、バイナリファイルの住所には
"abc\0"を書き込んであります。
引用返信 編集キー/
■56320 / inTopicNo.2)  Re[1]: バイナリファイルから文字列取得
□投稿者/ Blue (37回)-(2011/01/10(Mon) 13:42:36)
普通にReadChar で一文字ずつ読み込んで \0 が出たら終わりという風にしたらどうでしょうか?

BinaryReader.ReadChar メソッド
http://msdn.microsoft.com/ja-jp/library/system.io.binaryreader.readchar%28v=vs.85%29.aspx

↓は適当
            System.Collections.Generic.List<char> l = new System.Collections.Generic.List<char>();
            while (true)
            {
                char c = br.ReadChar();
                if (c == '\0') {
                    break;
                }
                l.Add(c);
            } 
            string s = new string(l.ToArray());



バイナリファイルの構成を変えてもよいのであれば、文字列の前に文字数をUInt64(でなくてもよいけど)付加させたほうが
読み込み安いかも。

引用返信 編集キー/
■56321 / inTopicNo.3)  Re[2]: バイナリファイルから文字列取得
□投稿者/ あや (2回)-(2011/01/10(Mon) 14:02:06)
No56320 (Blue さん) に返信

ありがとうございます。

> 普通にReadChar で一文字ずつ読み込んで \0 が出たら終わりという風にしたらどうでしょうか?
>
> BinaryReader.ReadChar メソッド
> http://msdn.microsoft.com/ja-jp/library/system.io.binaryreader.readchar%28v=vs.85%29.aspx
>
> ↓は適当
> System.Collections.Generic.List<char> l = new System.Collections.Generic.List<char>();
> while (true)
> {
> char c = br.ReadChar();
> if (c == '\0') {
> break;
> }
> l.Add(c);
> }
> string s = new string(l.ToArray());
>
こちら試してみます。

> バイナリファイルの構成を変えてもよいのであれば、文字列の前に文字数をUInt64(でなくてもよいけど)付加させたほうが
> 読み込み安いかも。
書き込み形式を変えてみました。

構造体
struct Param
{
public long no;
public long day;
public long i;
public string address;
}

変数に数値格納
Param prm = new Param();
prm.no = 1;
prm.day = 110101;
prm.i = 4;
prm.address = "abc\0";

ファイルに書き込み
FileStream fS = new FileStream(file_name, FileMode.Append, FileAccess.Write);
BinaryWriter sw = new BinaryWriter(fS);
sw.Write(prm.no);
sw.Write(prm.day);
sw.Write(prm.i);
sw.Write(prm.address);

これだと、"abc\0"は取得できませんでした。
プログラムの仕方が間違っていると思うのですが
どこが違うのかわからないので
教えてください。
引用返信 編集キー/
■56322 / inTopicNo.4)  Re[3]: バイナリファイルから文字列取得
□投稿者/ Blue (38回)-(2011/01/10(Mon) 14:06:46)
\0 って書き込まれるんですかね?

>prm.i = 4;
>prm.address = "abc\0";

prm.address = "abc\0";
prm.i = prm.address.Lenght;

として読み込み時に
prm.i = br.ReadInt64();
prm.address = new string(br.ReadChars(prm.i));
とするとループなんかしなくてもいいということを言いたかったのですけど。
引用返信 編集キー/
■56323 / inTopicNo.5)  Re[3]: バイナリファイルから文字列取得
□投稿者/ Hongliang (744回)-(2011/01/10(Mon) 14:06:59)
書き込みも BinaryWriter でできるなら、単純に Write で文字列書き込んで ReadString で文字列読み出すだけで良いはずですけど。NULL 文字を意識する必要があるのでしょうか?
テスト的に BinaryWriter を使ってるだけでほんとは別の何かが出力するバイナリ?
引用返信 編集キー/
■56324 / inTopicNo.6)  Re[4]: バイナリファイルから文字列取得
□投稿者/ あや (4回)-(2011/01/10(Mon) 14:10:09)
No56322 (Blue さん) に返信
> \0 って書き込まれるんですかね?
>
> >prm.i = 4;
> >prm.address = "abc\0";
> は
> prm.address = "abc\0";
> prm.i = prm.address.Lenght;
>
> として読み込み時に
> prm.i = br.ReadInt64();
> prm.address = new string(br.ReadChars(prm.i));
> とするとループなんかしなくてもいいということを言いたかったのですけど。

すみません。
理解不十分でした。
引用返信 編集キー/
■56325 / inTopicNo.7)  Re[4]: バイナリファイルから文字列取得
□投稿者/ あや (5回)-(2011/01/10(Mon) 14:12:51)
No56323 (Hongliang さん) に返信
> 書き込みも BinaryWriter でできるなら、単純に Write で文字列書き込んで ReadString で文字列読み出すだけで良いはずですけど。NULL 文字を意識する必要があるのでしょうか?
> テスト的に BinaryWriter を使ってるだけでほんとは別の何かが出力するバイナリ?

ReadStringで出来ました。
さっきは出来なかったのに・・・
ご迷惑おかけしました!

ありがとうございました!
解決済み
引用返信 編集キー/
■56326 / inTopicNo.8)  Re[5]: バイナリファイルから文字列取得
□投稿者/ Blue (39回)-(2011/01/10(Mon) 14:18:04)
>書き込みも BinaryWriter でできるなら、単純に Write で文字列書き込んで ReadString で文字列読み出すだけで良いはずですけど。
BinaryWrite,Write(String)を使っているんですね。
\0 ってのが出てきたので、てっきりC#で書き込まれたファイルではないかと思いました。
# まぁ、最初のコードではBinaryWriteをつかっているとは読み取れなかったですし。。。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -