VC++6で使っています。
int q;
int p;
int m;
int L=256;
FILE *Hfk;
static float Rep[9][128][30];
fpos_t pos;
::::::::::::::::::::::::
::::::::::::::::::::::::
for (q=1;q<=L;q++)
for (p=0;p<30;p++)
{
if ((((int)(q/2))*2) == q)
{
fputc(Rep[m][q-1][p],Hfk);
if (q == 8)
fgetpos(Hfk, &pos); /* (a) */
fputc(q,Hfk); /* (c) */
if (q == 8)
fgetpos(Hfk, &pos); /* (b) */
}
}
::::::::::::::::::::::::
::::::::::::::::::::::::
において、q == 2,4,6,8の時は
何故か(a)から(b)へのfgetposは1バイトずつ進んで
希望の値が書かれているのですが、
何故か、ここのif (q == 8)が
if (q == 10)になったとたん、
(a)から(b)へのfgetposは2バイト進んでしまい、
バッファーを見ると(c)のFPUTでは
0AのWRITEが好ましいのに、
0D0Aとなって、以降1バイトすれて来ています。
何が悪いと考えられるのでしょうか?
オープンするときに、テキストモードにしていませんか。
テキストモードの場合は、0x0a(LF)を出力すると0x0d(CR)を付属させます。
バイナリーモードにされたらいいですよ。
ご指摘ありがとうございます。
でもテキストモードとバイナリーモードって、何処で切り分けるのでしょうか?
>FILE *Hfk;
これにたいしてfopenなどしていると思いますが
そのfopen()に指定すれば良いですよ
詳細はMSDN見てね!
文字列として認識できるデータだけを処理するのでしたらテキストモードでOKです。
この場合は、NULL文字等の0x00~0x1Fのデータは扱えないと思ってください。
バイナリモードの場合は、どんなデータでも扱えます。
fopen( FileName, wb); // バイナリモード
fopen( FileName, wt); // テキストモード
Fjさんの場合はバイナリモードじゃないとおかしくなりますよ。
皆様
ありがとうございました。
解決です。
当初、
fopen( FileName, w+);
fopen( FileName, a+);
を、バイナリーモードにしようと思って
fopen( FileName, w+,b);
fopen( FileName, a+,b);
にしたら、あれ、コンパイルでは通るものの、
まだテキストモードになっているようで、
fopen( FileName, wb+);
fopen( FileName, ab+);
とすると、ちゃんと出来たファイルの中身は
期待通り、
09000A00...
となっていまして、一安心というところです。
皆様のご指摘がなければわからないところでしたし、
いろいろありがとうございました。