何でここだけ2バイト飛ぶのかな? – プログラミング – Home

何でここだけ2バイト飛ぶのかな?
 
通知
すべてクリア

[解決済] 何でここだけ2バイト飛ぶのかな?


Fj
 Fj
(@Fj)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

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バイトすれて来ています。

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


引用未解決
トピックタグ
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

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


返信引用
Fj
 Fj
(@Fj)
ゲスト
結合: 23年前
投稿: 15
Topic starter  

ご指摘ありがとうございます。

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


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>FILE  *Hfk;
これにたいしてfopenなどしていると思いますが
そのfopen()に指定すれば良いですよ
詳細はMSDN見てね!


返信引用
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

 文字列として認識できるデータだけを処理するのでしたらテキストモードでOKです。
 この場合は、NULL文字等の0x00~0x1Fのデータは扱えないと思ってください。

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

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

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

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


返信引用
Fj
 Fj
(@Fj)
ゲスト
結合: 23年前
投稿: 15
 

皆様
ありがとうございました。
解決です。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました