プロが教える店舗&オフィスのセキュリティ対策術

私は現在、C言語のストリームというところを勉強中で、その中でfopen()やfread(),fwrite()といった関数の使い方の例が参考書に書いてあるのですが、結果が上手く表示されず困っています。次にプログラムの説明と、ソースを載せています。

<説明>
10個の要素を持つ配列を浮動小数点数で埋め、それらをファイルに書き込み再び読み込みます。このプログラムは配列の要素を1つずつ書き込みます。

#include <stdio.h>
#include <stdlib.h>

double d[10] = {
10.2, 5.3, 7.91, 1.23, 7.7,
6.4, 89.12, 6.43, 5.55, 2.5
};

int main(void)
{
FILE *fp;
int i;

if((fp = fopen("myfile", "wb")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}

if(fwrite(d, sizeof d, 1, fp) != 1){
printf("書き込みエラー\n");
exit(1);
}
fclose(fp);

if((fp = fopen("myfile", "rb")) == NULL){
printf("ファイルを開くことが出来ません\n");
exit(1);
}

for(i = 0; i < 10; i++)
d[i] = -1.0;

if(fread(d, sizeof d, 1, fp) != 1){
printf("読み込みエラー\n");
exit(1);
}
fclose(fp);

for(i = 0; i < 10; i++)
printf("%f\n", d[i]);

return 0;
}

これを実行後、myfileをテキスト形式で開くと
ffffff$@333333@、p=
ラ」@ョG痙ョ・ヘフフフフフ@囮劔劔@H痙ョGV@ク・Qク@333333@ @
と文字化けして表示されてしまいます。

プログラミング自体勉強するのは今回が初めてで、何がダメなのか見当が付きません。
実行時にエラーが出るわけでもありません。
長くなりましたが、解決策がお分かりの方よろしくお願いします。

A 回答 (5件)

モードフラグをバイナリ指定しているのでテキスト形式では数値に該当する文字コードの文字が見えてしまいます。


数字をテキストで読めるように書き込みたい場合は,数値を文字列に変換後のほうが良いかと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
シンプルで分かりやすかったです。

お礼日時:2015/01/15 10:42

>それでは、このソースコードではmyfile内で文字化けが起こるのは仕方がないと思って良いのでしょうか?



そもそも、そのプログラムではmyfileはテキストファイルとして扱ってはいませんから文字化けとか以前の話です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
助かりました。

お礼日時:2015/01/15 10:41

プログラムの冒頭を


char d[] = {
"10.2, 5.3, 7.91, 1.23, 7.7,"
"6.4, 89.12, 6.43, 5.55, 2.5"
};
に変更してプログラムをコンパイル、実行し、myfileをテキスト形式で開いてみてください。

次に最後のfor文を
printf("%s\n", d);
に置き換えてコンパイル、実行して表示を確認してください。

それから、テキストファイルとバイナリファイルの違いを勉強しましょう。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
勉強し直して理解を深めます。

お礼日時:2015/01/15 10:43

>結果が上手く表示されず困っています。



最後のprintf()で正しく表示されているんじゃないですか?
浮動小数点の関係で誤差があるかも知れませんが。

>myfileをテキスト形式で開くと
> :
>と文字化けして表示されてしまいます。

人間が読める形式で書き出してませんから当然かと。
コンピューターが読みやすい形式と人間が読みやすい形式が同じとは限りません。
人間が読みやすい形式で書き出したいのならば、1つずつprintf()やfprintf()などで書き出して下さい。
write()1回で…というわけには行きません。

この回答への補足

回答ありがとうございます。
DOS画面上ではしっかり表示されます。
ただ私の予想では、myfile内でもdouble d[10]が表示されるものだと思っていたので、文字化けして表示されていたので、あれ?って感じでした。
それでは、このソースコードではmyfile内で文字化けが起こるのは仕方がないと思って良いのでしょうか?

補足日時:2015/01/12 15:13
    • good
    • 1

何がダメなんでしょうか?

    • good
    • 0

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