- ベストアンサー
WriteFileで数値が書き込めません
- WriteFileで数値を書き込もうとしても、数値が書き込めません。文字列は問題なく書き込まれます。
- Visual C++ Express EditionとWindows Vista SP2の環境で、WriteFileで数値を書き込もうとした際に問題が発生します。
- 試しに使用したコードやハンドルの取得は正常であり、戻り値も正常に返りますが、ファイルを開くと数値が書き込まれていません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>ただ、後で32ビットの最高値が入るとして、それを文字列に変換したらこの位は必要かと思い、この変数を用意致しました。 0xffffffff=4294967295ですから、10桁ということになるでしょう。 # 当然文字列として扱うために'\0'の分も必要ですが。 >しかし、作成されたファイルをメモ帳に関連付けて中をのぞいてみますと、0(ゼロ)が書き込まれるべき場所が、空白に成っているのです。 書き込まれたのは「数値」の0であって、「数字」の'0'ではありません。 よって、メモ帳で開いても「0」は見えません。 書き出したいのは「数値」なんですよね? バイナリエディタで確認して下さい。 「数字」で書き出したいのであれば、WriteFile()の第2引数はDSLongBuffになるかと。 あと、オーバーラップは不要かと思われますがどうなんでしょう?
その他の回答 (2)
- Wr5
- ベストアンサー率53% (2173/4061)
補足要求しつつ要求内容を書き忘れた… 『結果としてファイルにどんな【値】が書き込まれていることを期待していますか?』 一応、リトルエンディアンってことていいのでしょうか? # とはいえ12桁の数値だと32ビットを越えているかと思いますが。
- Wr5
- ベストアンサー率53% (2173/4061)
気のせいでなければ…ですが… なんか無茶苦茶のような気がするのですが…… >char DSLongBuff[] = _T("12345678901"); >LONG DSnPosX = 0L; >errno_t DSErr = _i64toa_s((long)DSnPosX, DSLongBuff, 12, 10); http://msdn.microsoft.com/ja-jp/library/0we9x30h(VS.80).aspx より… DSnPosXの0を文字列としてDSLongBuff[]に「入れ」ます。 これは意図した動作ですよね? _T("12345678901")も文字列リラテルの意味がほとんどありませんが。 >BOOL DSfBool = ::WriteFile(DShReDraw, (LPCVOID)&DSnPosX, (LONG)DSdw, >DSlpDW, &DSOverLapped); オーバーラップは置いておきますが… http://msdn.microsoft.com/ja-jp/library/cc429856.aspx DSnPosXの変数が確保されている場所から、「1バイト」書き出します。 そして、謎のDSlpDWにそのサイズ(1)を書き出します。 ちなみに、DSnPosXは0なので書き出したファイルには1バイトの0が書き込まれている…ハズです。 CreateFile時にFILE_FLAG_OVERLAPPED フラグは無いみたいなので… オーバーラップは使われていない??
補足
Wr5さん、お世話に成ります。 <DSnPosXの0を文字列としてDSLongBuff[]に「入れ」ます。 <これは意図した動作ですよね? はい、ゼロが書き込まれればこちらの意図した結果です。 <_T("12345678901")も文字列リラテルの意味がほとんどありませんが。 すみません。単に数え間違えました。ただ、後で32ビットの最高値が入るとして、それを文字列に変換したらこの位は必要かと思い、この変数を用意致しました。 <DSnPosXの変数が確保されている場所から、「1バイト」書き出します。 <そして、謎のDSlpDWにそのサイズ(1)を書き出します。 確かに、ブレークポイントを設定し変数を見ますと、DSlpDWに0(ゼロ)が1バイト書き出されています。しかし、作成されたファイルをメモ帳に関連付けて中をのぞいてみますと、0(ゼロ)が書き込まれるべき場所が、空白に成っているのです。最初は、ゼロだから空白なのかとも思いましたが、ReadFile()で読み込まれませんので、やはり書き込まれていないと、判断しました。 以上、何卒よろしくお願い致します。
お礼
Wr5さん、どうも有難うございました。 >書き出したいのは「数値」なんですよね? >バイナリエディタで確認して下さい。 メモ帳で開いても数値は見えないのですね。非常に、申し訳御座いませんでした。バイナリエディッターで開いたところ、数値のゼロが書き込まれているのを確認致しました。 >あと、オーバーラップは不要かと思われますがどうなんでしょう? 確かに、今現在はテスト用ですので必要無いのですが、これから先大きなファイルを取り扱う予定でありますので、実際にファイの書き込みが終了したかどうかを後々判断する為に、取りあえずOVERLAPPEDを設定致しております。 Wr5さん、誠に有難う御座いました。私の勘違い及び勉強不足でご迷惑をお掛けいたしました。これから、もっともっと、勉強していきたいと思います。