何でここだけ2バイト飛ぶのかな?

[戻る]
Fj 2002/11/14(木) 18:01:51
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バイトすれて来ています。

何が悪いと考えられるのでしょうか?

アイススケーター 2002/11/14(木) 18:38:13
オープンするときに、テキストモードにしていませんか。
テキストモードの場合は、0x0a(LF)を出力すると0x0d(CR)を付属させます。
バイナリーモードにされたらいいですよ。

Fj 2002/11/15(金) 09:17:41
ご指摘ありがとうございます。

でもテキストモードとバイナリーモードって、何処で切り分けるのでしょうか?

wood 2002/11/15(金) 09:27:18
>FILE  *Hfk;
これにたいしてfopenなどしていると思いますが
そのfopen()に指定すれば良いですよ
詳細はMSDN見てね!

アイススケーター 2002/11/15(金) 10:02:25
 文字列として認識できるデータだけを処理するのでしたらテキストモードでOKです。
 この場合は、NULL文字等の0x00〜0x1Fのデータは扱えないと思ってください。

 バイナリモードの場合は、どんなデータでも扱えます。

    fopen( "FileName", "wb");    // バイナリモード

    fopen( "FileName", "wt");    // テキストモード

Fjさんの場合はバイナリモードじゃないとおかしくなりますよ。

Fj 2002/11/17(日) 16:54:17
[[解決]]
皆様
ありがとうございました。
解決です。

当初、
    fopen( "FileName", "w+");    
    fopen( "FileName", "a+"); 
を、バイナリーモードにしようと思って  
    fopen( "FileName", "w+",b);    
    fopen( "FileName", "a+",b); 
にしたら、あれ、コンパイルでは通るものの、
まだテキストモードになっているようで、
    fopen( "FileName", "wb+");    
    fopen( "FileName", "ab+"); 
とすると、ちゃんと出来たファイルの中身は
期待通り、
09000A00...
となっていまして、一安心というところです。

皆様のご指摘がなければわからないところでしたし、
いろいろありがとうございました。

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