ファイル転送

[戻る]
ねこ 2006/01/24(火) 15:34:59
AP同士のデータのやり取りをファイル転送で行っています。
構造体をそのままファイルに書き込み、
File.Write(stData, sizeof(stData));
それを受け側がよみこんでいます。
File.Read(stData, sizeof(stData));

こういうふうなロジックだとまずい事はあるのでしょうか?
アライメントはAP同士同じで規定値になっています。

同じ構造体のサイズをsizeof()でとる時、
AP毎で値が違ったりします。

これはどういう事が原因で起きたりするのでしょうか?

tetrapod 2006/01/24(火) 16:18:17
状況がはっきりしませんが、例えば異アーキテクチャのマシン間ではまずいですし、
おそらく 64bit Windows と 32bit Windows の間でもまずいでしょうし
同一アーキテクチャであっても異コンパイラで作ったソフト間ではまずいでしょう。

また stData の構造体の中にポインタメンバがあったり C++ でいうところの
virtual な機能が使われていたりしたら、同一コンパイラでもまずいです。

同一コンパイラで同一 alignment で同一 struct の sizeof が異なるというのは
限りなく考えられないので、どこかにミスがありそうです。
コンパイルオプションとか、ソースコードとか...

何も考えずに構造体を直接 Write/Read するってのは、
移植性(異マシン/コンパイラ)や拡張性(データフォーマット)とかを限りなく犠牲にして
ソースコードを簡単にする *手抜き* でしかないのでお勧めできません。

コケン [E-Mail] 2006/01/24(火) 16:37:03
WriteとReadが同じにならなければなりません。
例えば「/Zp16」でファイルを作れば、「/Zp16」で読み込まなければならないです。

ALT + F7 --> C/C++ --> コード生成 --> 構造体メンバのアライメント

ねこ 2006/01/24(火) 16:48:08
やっぱり、可変長のデータに変換して、
ファイル転送すべきでしょうか?
これが一番いい方法でしょうか?

tetrapod 2006/01/24(火) 17:05:51
>これが一番いい方法でしょうか?
「いい」という判断はねこサン自身で行ってください。何が「いい」かは案件次第なので。

開発期間短縮が最も求められるなら Read/Write するのがいいだろうし
遅い回線を通して遠隔地にデータを持っていくなら更に圧縮/伸張する必要があるだろうし
そのデータが人間に可読でなきゃならんならテキストにすべきだろうし
浮動小数点数をテキストにすると変換誤差も出るだろうし

ITO 2006/01/24(火) 19:07:46
転送ファイルのフォーマットを決めて
ファイルを作るようにしたほうがいいと思います。
サイズも、固定長でねこさんが数値で決めた方がいいです。
構造体のサイズで決めると仕様変更などが生じたときわからなく
なりやすいです。

ファイル形式は、tetrapodさんのご意見通りねこさんが決めてください。
途中でエクセルでチェックできるように「CSV形式」で保存する手もあります。
サイズが大きくなりますが..........

ねこ 2006/01/26(木) 09:20:30
CのAPでファイル転送して、C++のAPでファイルを受信しています。
AP間でアライメントが違っていますが、可変長の文字列を送信して、
これは解決しました。
が・・・、C++のAPで受け取る時に使用する構造体が
Cで宣言している構造体の為アライメントが違い?、それをC++で
宣言した構造体(同じ構造体)にいれると、値がこわれてしまいます。
どうすれば、いいのでしょう・・・

επιστημη 2006/01/26(木) 09:28:22
答えは既に述べられています。
構造体を丸ごとそのまま送るのでは問題があるのなら、
お互いが符号/復号できるフォーマットを定め、それに従います。

ITO 2006/01/26(木) 10:19:33
何で可変長なんですか。
文字列を固定長にすることは、出来ないのですか。
ファイルに保存する構造体に入るデータは固定長でないといけないと思います。

そして、ファイルのサイズは、その構造体より大きめのサイズの固定長に決めます。
余白の部分は、'00H'など分りやすい値で埋めます。

そうしないとうまくいかないと思いますが........

ITO 2006/01/27(金) 18:59:33
もしかして、
構造体にcharやunsigned char以外の変数
intやfloatなどを決めてませんか?
ファイルに書き込むときは、「charやunsigned char」
BYTE型にして書き込まないと値がこわれる可能性があります。

Ban 2006/01/28(土) 01:44:06
自分でフォーマットを決めてシリアライズ/デシリアライズしてるなら、
「その環境でそのフォーマットとして出力できる限り」、
int でも floatでも大丈夫だと思いますけど。

ITO 2006/01/28(土) 11:32:38
そうですBANさんの意見通り、
>「その環境でそのフォーマットとして出力できる限り」
 をしていれば可能です。

ただ、ねこさんの発言を見ると
 構造体に「intやfloat」が入っててもそのままファイルに書き込もうと
 しているふしがあったからです。




   

ねこ 2006/01/28(土) 13:05:35
[[解決]]
おかげさまで、ファイル転送する事ができました。
固定長でファイル転送する事にしました。
ちょっと、心配ですが。。。
可変長にしようとすると、かなりの改修要領になるので
やめました。
ファイル転送用のTBLのヘッダーをインクルードする所によって、
アライメントが変わってくる事があるようで(よく分かりませんが)、
アライメントが変わらない所でインクルードを行う事で、解決?しました。

古いスレッドには追加発言できません。