プロが教えるわが家の防犯対策術!

fprintfで数字をファイルに"w"モードで書き込んでいるだけなのですが、書き込む回数(数字の数)が大きいだけファイルに書き込んでも文字化けしてしまいます。原因は何が考えられるでしょうか?
ちなみにprintfではちゃんと表示されています。

環境はWindowsXPでCygwinを使っています。

A 回答 (4件)

直接の原因かどうかは、入力ファイルが提示されていないので、判りませんが、危ないところを指摘しておきます。


while(fscanf(fp2,"%d",&i) != EOF){
cw[i]++;  ・・・iは0<=Nの範囲内でないと、メモリ破壊を起こします。
そのチェックがされていません。
for (c = 1; c <=ww ; c++){ ・・・wwはN以内でないといけないが、Nを越えている可能性があります。
fprintf(fp1,"%d ",rw[c]); 
}
1.上記の2点で、もし、正常範囲を逸脱したら、画面にその内容を表示して、プログラムを停止するように、してください。
2.もし、1で停止した場合は、iとwwを正常範囲に強引に書き換えて、継続するように、プログラムを修正してください。
    • good
    • 0

本来出力されるべき内容と文字化けしてしまった結果も提供してもらえれば、原因特定に役立つと思いますよ。

    • good
    • 0

入力ファイルの内容も見せてくださるとありがたいです。


こちらで勝手に作ってしまうと、同じ現象が発生しないことが
あり得ますので。
    • good
    • 0

ソースコードを見せてください。

この回答への補足

ソースコードです。
ちなみにSolarisでは問題なかったです。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(int argc,char **argv)
{
int i,m,ww,temp,c,rm,cm,rmt,cmt;
int N;
int *rw,*cw;
FILE *fp1,*fp2;

N=atoi(argv[1]);

rw = (int*)malloc(sizeof(int)*(N+1));
cw = (int*)malloc(sizeof(int)*(N+1));

for (m = 0; m <= N; m++){
rw[m]=cw[m]=0 ;
}

temp=0;
ww=1;

if ((fp2 = fopen("test.txt","r")) == NULL){
exit(-1);
}

while(fscanf(fp2,"%d",&i) != EOF){
cw[i]++;
if(temp<i){rw[ww]=rw[ww]+1;}
if(temp>=i){ww++;rw[ww]=rw[ww]+1;}
temp=i;
}
fclose(fp2);
rm=rw[1];
for (m = 2; m <= ww; m++){rmt=rw[m];
if(rm<rmt){rm=rmt;}
}
cm=cw[1];
for (m = 2; m <= N; m++){cmt=cw[m];
if(cm<cmt){cm=cmt;}
}

fp1 = fopen("result.txt","w");
fprintf(fp1,"%d %d\n",N,ww);
fprintf(fp1,"%d %d\n",rm,cm);

for (c = 1; c <=ww ; c++){
fprintf(fp1,"%d ",rw[c]);
}
fprintf(fp1,"\n");

for (c = 1; c <=N ; c++){
fprintf(fp1,"%d ",cw[c]);
}
fprintf(fp1,"\n");

fclose(fp1);

 return (0);

}

補足日時:2006/12/08 22:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!