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

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

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

Re[6]: バイナリデータ保存・読み込み方法について。


(過去ログ 129 を表示中)

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

■76387 / inTopicNo.1)  バイナリデータ保存・読み込み方法について。
  
□投稿者/ フレッシュマン (1回)-(2015/07/06(Mon) 18:03:40)

分類:[C#] 

● 開発環境
・ Visual C# / windowsアプリケーション / win8・64bit

質問に目を通して頂きありがとうございます。

ComboBoxに3つの項目「A・B・C」を登録し、TextBoxを3つ用意するとします。
ComboBoxで項目を選択したのち、TextBoxに数値を打ち込み、その数値を
バイナリファイルに保存したいと考えております。

保存後、ComboBoxの「A・B・C」を選択すると、項目に対応した先程保存した数値がバイナリから
呼び戻されるようプログラムを作成したいと考えております。

また、「A・B・C」の登録が完了している状態で、Bの登録を削除する場合、
考え方としては、もう一つバイナリファイルを作成し、「A・B・C」のバイナリファイルを読み込み
「A・C」だけ読み込み、バイナリファイルを作り直すといった考え方で問題ないでしょうか?


例:ComboBoxで「A」を選択し、Textboxで1,2,3に値を入力。

合計:■(A) 計算:□(1)+□(2)=□(3)


バイナリファイル ・・・

A ----------------------
------------------------
B ----------------------
------------------------
C-----------------------
------------------------



「B」削除後 ・・・
A ---------------------
-----------------------
B ---------------------
-----------------------



「B」再入力後 ・・・
A ----------------------
------------------------
B ----------------------
------------------------
C-----------------------
------------------------


質問がうまくまとめられず、分かりずらい面もあると思いますが、
お答え・アドバイスの程、よろしくお願い致します。

引用返信 編集キー/
■76388 / inTopicNo.2)  Re[1]: バイナリデータ保存・読み込み方法について。
□投稿者/ フレッシュマン (2回)-(2015/07/06(Mon) 18:32:37)
途中作成のプログラムも貼らずに質問してしまい申し訳ございません。
エラーまみれで提示できるレベルのものでないのです・・・

考え方・使用に適したコマンドなどヒントを下さるだけでも結構ですので、
よろしくお願い致します。
引用返信 編集キー/
■76389 / inTopicNo.3)  Re[1]: バイナリデータ保存・読み込み方法について。
□投稿者/ WebSurfer (609回)-(2015/07/06(Mon) 18:43:10)
No76387 (フレッシュマン さん) に返信

> バイナリファイルに保存したいと考えております。

その「バイナリファイル」とはどういうものですか? バイナリという言葉はどう
いう意味を意図して使ってますか? そのあたりを説明していただかないと、話が
噛み合わないかもしれませんので・・・
引用返信 編集キー/
■76390 / inTopicNo.4)  Re[2]: バイナリデータ保存・読み込み方法について。
□投稿者/ フレッシュマン (5回)-(2015/07/06(Mon) 19:43:15)
No76389 (WebSurfer さん) に返信

お返事ありがとうございます。

datファイル形式で出力しようと考えております。
今回、textbox1/2/3に入力された値は、int型で取ろうと考えているため、
2バイトx3=6バイト毎にとりたいと思っております。

バイナリに書き込む際、
using(BinaryWriter w = new BinaryWriter(File.OpenWrite("binary.dat")))
{
w.Write(textbox1);
w.Write(textbox2);
w.Write(textbox3);
}
といったように一つずつ、書き込むような形でプログラムを組んでいるのですが、
効率が悪い書き方だと思っています。

クラス・構造体をまとめて一括でバイナリファイルにおとせたりするのでしょうか?

お手数おかけして申し訳ございませんが、お答えよろしくお願いいたします。

引用返信 編集キー/
■76391 / inTopicNo.5)  Re[3]: バイナリデータ保存・読み込み方法について。
□投稿者/ WebSurfer (610回)-(2015/07/06(Mon) 20:10:24)
No76390 (フレッシュマン さん) に返信

> datファイル形式で出力しようと考えております。

「datファイル形式」というのは何でしょうか? 具体的に説明していただけ
ませんか?
引用返信 編集キー/
■76392 / inTopicNo.6)  Re[1]: バイナリデータ保存・読み込み方法について。
□投稿者/ Azulean (500回)-(2015/07/06(Mon) 22:42:23)
No76387 (フレッシュマン さん) に返信
> ComboBoxに3つの項目「A・B・C」を登録し、TextBoxを3つ用意するとします。
> ComboBoxで項目を選択したのち、TextBoxに数値を打ち込み、その数値を
> バイナリファイルに保存したいと考えております。

いろいろと論点はあると思いますが、「バイナリファイル」にこだわる理由は何でしょうか?
また、その「バイナリファイル」の構造はすでに定まっているのか、今から決められる・変えられるのか、どちらでしょうか?

なお、「dat ファイル」は一般的な定義ではありません。
その拡張子を持つ多種多様なデータはありますが、それらは割と独自に定義されているものなので、「dat ファイル形式」と言われても、第三者には伝わらないのです。


> 保存後、ComboBoxの「A・B・C」を選択すると、項目に対応した先程保存した数値がバイナリから
> 呼び戻されるようプログラムを作成したいと考えております。

この要件だけでは、XML ファイルでもありかなと感じられましたので、前述のように「バイナリでなければならない理由」があれば、その旨を書いておいた方が良いでしょう。


> また、「A・B・C」の登録が完了している状態で、Bの登録を削除する場合、
> 考え方としては、もう一つバイナリファイルを作成し、「A・B・C」のバイナリファイルを読み込み
> 「A・C」だけ読み込み、バイナリファイルを作り直すといった考え方で問題ないでしょうか?

考え方、データサイズ次第かと思います。
少しでもファイルサイズを縮めたいのであれば、そういった考え方になります。
逆にデータ数が固定であるとか、書き込み時に一時的なコピーができるのがいやであるとかであれば、詰めず、「そのブロックを使わない」というビットを記録するのも手でしょう。
この辺は、決まった形・ルールがあるわけではなく、あなた自身の置かれた状況によって決めることになります。



No76390 (フレッシュマン さん) に返信
> といったように一つずつ、書き込むような形でプログラムを組んでいるのですが、
> 効率が悪い書き方だと思っています。

ケースバイケースかと思います。
3 個ぐらいであればそのまま書いた方がわかりやすいかもしれません。

コントロールの数が増えたとしても耐えられる書き方を考えるなら、配列とループを使っていただいた方がいいかもしれません。


> クラス・構造体をまとめて一括でバイナリファイルにおとせたりするのでしょうか?

できますが、バージョンアップでフィールドが増えると互換性の問題が出るなど、癖があるものもあります。
「シリアライズ」というキーワードで調べて学んでみてください。
引用返信 編集キー/
■76393 / inTopicNo.7)  Re[4]: バイナリデータ保存・読み込み方法について。
□投稿者/ フレッシュマン (7回)-(2015/07/06(Mon) 22:42:39)
No76391 (WebSurfer さん) に返信

>>「datファイル形式」というのは何でしょうか? 具体的に説明していただけ
ませんか?

http://smdn.jp/programming/netfx/stream/3_binaryreader_binarywriter/

このサイトを参照しました。
すみません。自分もdatファイルが何なのかという事は深く理解しておりません。
ただバイトごとに読み込む予定ですので、バイトごとに読み込めるのであれば、
txtでもbinでもdatでも拡張子は何でもいいと思っております。

WebSurferさんは、textboxに入力された値をバイナリファイルに落とし読み書きする際、
どのように考えているのでしょうか?

参考までにお聞かせ願えませんでしょうか。


引用返信 編集キー/
■76394 / inTopicNo.8)  Re[5]: バイナリデータ保存・読み込み方法について。
□投稿者/ WebSurfer (611回)-(2015/07/06(Mon) 23:04:25)
No76393 (フレッシュマン さん) に返信

> WebSurferさんは、textboxに入力された値をバイナリファイルに落とし読み書きする際、
> どのように考えているのでしょうか?

そういうことを聞く以上、「textboxに入力された値」というのが一体何なのか
理解した上で聞いているのですよね。例えば、123 と入力すると、TextBox.Text
プロパティで取得できる "123" という文字列はプログラムの中でどういう形でに
なるのでしょう? それをファイルに書き出すときには文字コードはどうするの
でしょう? 文字コードによってバイト列は変わるのは理解してますか?
引用返信 編集キー/
■76395 / inTopicNo.9)  Re[2]: バイナリデータ保存・読み込み方法について。
□投稿者/ フレッシュマン (8回)-(2015/07/06(Mon) 23:04:33)
No76392 (Azulean さん) に返信

お答えありがとうございます。

> いろいろと論点はあると思いますが、「バイナリファイル」にこだわる理由は何でしょうか?
> また、その「バイナリファイル」の構造はすでに定まっているのか、今から決められる・変えられるのか、どちらでしょうか?
> なお、「dat ファイル」は一般的な定義ではありません。
> その拡張子を持つ多種多様なデータはありますが、それらは割と独自に定義されているものなので、「dat ファイル形式」と言われても、第三者には伝わらないのです。
> この要件だけでは、XML ファイルでもありかなと感じられましたので、前述のように「バイナリでなければならない理由」があれば、その旨を書いておいた方が良いでしょう。

バイナリファイルにこだわる理由と致しまして、他の開発者にtextboxに打ち込まれた値を渡す必要があるのでこのような形式を取らせて頂きました。
他の開発者から容量がtxtなどに比べて小さいdatファイルで渡してほしいとの指示を受けこのような形になっております。
datファイルの中身は、int型しか入らないので、2バイトごとに呼び出せば、textboxに入力された値が呼び出せるようにしたいと思っております。
すいません。datファイルに関しましては、今の自分ではこの説明で精一杯です。
xmlファイルというものもあるのですね。調べさせて頂きます。


> ケースバイケースかと思います。
> 3 個ぐらいであればそのまま書いた方がわかりやすいかもしれません。
> コントロールの数が増えたとしても耐えられる書き方を考えるなら、配列とループを使っていただいた方がいいかもしれません。

配列とループを使用し、値を格納していくという事ですね。
参考になりました。


> できますが、バージョンアップでフィールドが増えると互換性の問題が出るなど、癖があるものもあります。
> 「シリアライズ」というキーワードで調べて学んでみてください。

シリアライズについて調べてきます。
もしわからないことがありましたら、再度質問させて頂いてもよろしいでしょうか。
お手数おかけして誠に申し訳ございませんが、よろしくお願いいたします。
引用返信 編集キー/
■76396 / inTopicNo.10)  Re[3]: バイナリデータ保存・読み込み方法について。
□投稿者/ WebSurfer (612回)-(2015/07/06(Mon) 23:10:51)
No76395 (フレッシュマン さん) に返信

> 容量がtxtなどに比べて小さいdatファイル

どういう意味か説明できますか?

引用返信 編集キー/
■76397 / inTopicNo.11)  Re[3]: バイナリデータ保存・読み込み方法について。
□投稿者/ Azulean (501回)-(2015/07/06(Mon) 23:39:43)
No76395 (フレッシュマン さん) に返信
> バイナリファイルにこだわる理由と致しまして、他の開発者にtextboxに打ち込まれた値を渡す必要があるのでこのような形式を取らせて頂きました。
> 他の開発者から容量がtxtなどに比べて小さいdatファイルで渡してほしいとの指示を受けこのような形になっております。
> datファイルの中身は、int型しか入らないので、2バイトごとに呼び出せば、textboxに入力された値が呼び出せるようにしたいと思っております。

相手がいるのであれば、相手と細かく詰めた方が良いでしょう。
ところで、C# における int 型は 4 バイトです。「2 バイトごと」というあたりで誤解があるようにお見受けします。
引用返信 編集キー/
■76398 / inTopicNo.12)  Re[4]: バイナリデータ保存・読み込み方法について。
□投稿者/ フレッシュマン (9回)-(2015/07/07(Tue) 00:59:32)
No76397 (Azulean さん) に返信

> 相手がいるのであれば、相手と細かく詰めた方が良いでしょう。
> ところで、C# における int 型は 4 バイトです。「2 バイトごと」というあたりで誤解があるようにお見受けします。

4バイトですね。すいません勘違いしておりました。
相手はいるのですが、相手方が忙しく話し合う時間がとれないのでなかなか詰められずにいる現状です・・・
4月に新卒で会社に入り、参考書を渡されプログラムの勉強を始めておりますが、何から手をつければよいか・・・といった現状です。

WebSurferさん

> 容量がtxtなどに比べて小さいdatファイル

すいません。答えられません。
開発部の先輩の方がdatの方がデータが小さくなるといっていたのを聞いた程度です。
引用返信 編集キー/
■76399 / inTopicNo.13)  Re[5]: バイナリデータ保存・読み込み方法について。
□投稿者/ フレッシュマン (10回)-(2015/07/07(Tue) 01:11:52)
> WebSurferさん
>そういうことを聞く以上、「textboxに入力された値」というのが一体何なのか
>理解した上で聞いているのですよね。例えば、123 と入力すると、TextBox.Text
>プロパティで取得できる "123" という文字列はプログラムの中でどういう形でに
>なるのでしょう? それをファイルに書き出すときには文字コードはどうするの
>でしょう? 文字コードによってバイト列は変わるのは理解してますか?

すいません。
レベルの低い質問に気分を害されてますよね。
申し訳ないです。

//データがShift-JISの場合
//byte[] data = System.Text.Encoding.GetEncoding("shift_jis").GetBytes(text);

//データがEUCの場合
//byte[] data = System.Text.Encoding.GetEncoding("euc-jp").GetBytes(text);

//データがunicodeの場合
//byte[] data = System.Text.Encoding.Unicode.GetBytes(text);

//データがutf-8の場合
//byte[] data = System.Text.Encoding.UTF8.GetBytes(text);

といった形で文字コードが複数あり、この設定に沿ってバイト列に変化がみられるという解釈をしています。
引用返信 編集キー/
■76400 / inTopicNo.14)  Re[6]: バイナリデータ保存・読み込み方法について。
□投稿者/ 魔界の仮面弁士 (395回)-(2015/07/07(Tue) 02:26:01)
No76395 (フレッシュマン さん) に返信
> xmlファイルというものもあるのですね。
文字コードの縛りが緩く、C# からの読み書きも簡単に行えます。
ただし、データ量はやや大きめとなりますので、
ファイルサイズを下げることが必須条件となる場合には採用しにくいかも知れません。



No76399 (フレッシュマン さん) に返信
>>プロパティで取得できる "123" という文字列はプログラムの中でどういう形でに
> といった形で文字コードが複数あり、この設定に沿ってバイト列に変化がみられるという解釈をしています。

具体的に、それぞれの変換結果がどのようなバイト列になるのか、違いを把握されていますか?


他の開発者とデータのやり取りをするのであれば、受け渡すべきデータを
  『最終的にどのようなバイナリフォーマットで渡すのか』
と言う点は、コーディング前に決めておかねばならないでしょう。


一口にバイナリファイルと言っても、データの表現は様々です。広義で言えば、
テキストファイルと言えど、突き詰めればバイナリデータの集合体なわけですしね。



データのフォーマットが決まった上であれば、後はそれを C# 側でどのように実装するべきかという
具体的な話にも進めますが、まだフォーマットすら明確に決まっていない段階では、

No76387
>といった考え方で問題ないでしょうか?

No76390
> といったように一つずつ、書き込むような形でプログラムを組んでいるのですが、
> 効率が悪い書き方だと思っています。

という質問をされても、良し悪しの判断を下しようが無いと思います。



> レベルの低い質問に気分を害されてますよね。
レベルの高低というよりは、要件が曖昧すぎて答えにくい感じですね。
テキストボックスに入れる数値の範囲も明確になっていないですし。


> 例:ComboBoxで「A」を選択し、Textboxで1,2,3に値を入力。
では、もっと具体的な例で行きましょうか。

ここでは話を単純にするため、
 textBox1.Text = "123";
というデータがあるとして、これをいろいろな方式でファイル化してみます。


(案1) 6 バイト:31 00 32 00 33 00  … UTF-16 文字列として出力
(案2) 4 バイト:7B 00 00 00  … C# の int 値「123」をリトルエンディアンで出力
(案3) 4 バイト:02 00 7B 00  … VBA の Variant 型で、Intger 値「123」をバイナリ出力
(案4) 3 バイト:31 32 33  … Shift_JIS 文字列として出力
(案5) 3 バイト:F1 F2 C3  … ゾーン10進数(アンパック10進数)で出力
(案6) 2 バイト:12 3C  … パック10進数で出力
(案7) 2 バイト:7B 00  … 16bit整数としてリトルエンディアンで出力
(案8) 2 バイト:00 7B  … 16bit整数としてビッグエンディアンで出力
(案9) 1 バイト:7B  … 8bit整数として出力
(案10)1 バイト:FA  … 8bitエクセス127で出力


あえてメジャーでは無いフォーマットも挙げていますが、
同じ「123」というデータを表すにも、上記の他、いろいろな表現方法があるわけです。
しかも今回は、複数のテキストボックスからのデータを埋め込みたいようですし。


表現方法が異なれば、それを出力するための C# コードも当然異なるわけですから、
まずは仕様をキチンと定めるところからはじめて無いと先に進めません。

相手が忙しいようであれば、自分の方で、具体的なフォーマット案を幾つか提示し、
その中から選んでもらうよう、相手にメール等で打診してみては如何でしょうか。
引用返信 編集キー/
■76401 / inTopicNo.15)  Re[5]: バイナリデータ保存・読み込み方法について。
□投稿者/ WebSurfer (613回)-(2015/07/07(Tue) 02:40:44)
No76398 (フレッシュマン さん) に返信

> 開発部の先輩の方がdatの方がデータが小さくなるといっていたのを聞いた程度です。

であれば、その「開発部の先輩の方」に聞きましょうよ。ここで聞くまでもなく、同じ
会社の先輩なら、聞けばちゃんと答えてくれますよね。

聞けない、もしくは聞いても答えれくれないということでここで聞いているのだとする
と、ちょっと自分的には信じられないです。
引用返信 編集キー/
■76402 / inTopicNo.16)  Re[6]: バイナリデータ保存・読み込み方法について。
□投稿者/ フレッシュマン (11回)-(2015/07/07(Tue) 09:02:18)
No76401 (WebSurfer さん) に返信

> であれば、その「開発部の先輩の方」に聞きましょうよ。ここで聞くまでもなく、同じ
> 会社の先輩なら、聞けばちゃんと答えてくれますよね。
>
> 聞けない、もしくは聞いても答えれくれないということでここで聞いているのだとする
> と、ちょっと自分的には信じられないです。

誠に申し訳ないです。
先輩社員はVBを使用しており、C#に関することを聞かれても困るといった風だったので、誰にも聞けず分からないことが溜まってしまっている現状です・・・


>>魔界の仮面弁士

>>(案1) 6 バイト:31 00 32 00 33 00  … UTF-16 文字列として出力
>>(案2) 4 バイト:7B 00 00 00  … C# の int 値「123」をリトルエンディアンで出力
>>(案3) 4 バイト:02 00 7B 00  … VBA の Variant 型で、Intger 値「123」をバイナリ出力
>>(案4) 3 バイト:31 32 33  … Shift_JIS 文字列として出力
>>(案5) 3 バイト:F1 F2 C3  … ゾーン10進数(アンパック10進数)で出力
>>(案6) 2 バイト:12 3C  … パック10進数で出力
>>(案7) 2 バイト:7B 00  … 16bit整数としてリトルエンディアンで出力
>>(案8) 2 バイト:00 7B  … 16bit整数としてビッグエンディアンで出力
>>(案9) 1 バイト:7B  … 8bit整数として出力
>>(案10)1 バイト:FA  … 8bitエクセス127で出力

>>表現方法が異なれば、それを出力するための C# コードも当然異なるわけですから、
>>まずは仕様をキチンと定めるところからはじめて無いと先に進めません。

>>相手が忙しいようであれば、自分の方で、具体的なフォーマット案を幾つか提示し、
>>その中から選んでもらうよう、相手にメール等で打診してみては如何でしょうか

詳しい案と開発の進め方に関するアドバイス頂きありがとうございます。
魔界の仮面弁士さんのおかげでファイル化のイメージがだいぶ固まりました。

皆様から頂いたヒントを頼りに今日一日考えてみたいと思います。
ご迷惑おかけし申し訳ございませんでした。


解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -