
私は現在、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@ @
と文字化けして表示されてしまいます。
プログラミング自体勉強するのは今回が初めてで、何がダメなのか見当が付きません。
実行時にエラーが出るわけでもありません。
長くなりましたが、解決策がお分かりの方よろしくお願いします。
No.3
- 回答日時:
プログラムの冒頭を
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);
に置き換えてコンパイル、実行して表示を確認してください。
それから、テキストファイルとバイナリファイルの違いを勉強しましょう。
No.2
- 回答日時:
>結果が上手く表示されず困っています。
最後のprintf()で正しく表示されているんじゃないですか?
浮動小数点の関係で誤差があるかも知れませんが。
>myfileをテキスト形式で開くと
> :
>と文字化けして表示されてしまいます。
人間が読める形式で書き出してませんから当然かと。
コンピューターが読みやすい形式と人間が読みやすい形式が同じとは限りません。
人間が読みやすい形式で書き出したいのならば、1つずつprintf()やfprintf()などで書き出して下さい。
write()1回で…というわけには行きません。
この回答への補足
回答ありがとうございます。
DOS画面上ではしっかり表示されます。
ただ私の予想では、myfile内でもdouble d[10]が表示されるものだと思っていたので、文字化けして表示されていたので、あれ?って感じでした。
それでは、このソースコードではmyfile内で文字化けが起こるのは仕方がないと思って良いのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# #include <stdio.h>int main(void) { int buf[100] = 6 2022/11/01 22:45
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
printf による16進表示について
-
reallocでエラー
-
#defineが使用するメモリ領域に...
-
プログラミングの授業の課題です
-
C言語についてです。
-
エラーについて質問です。
-
fatal error LNK1120: 外部参照...
-
「指定されたキャストは有効で...
-
「Aに対するBの割合」と「Aに対...
-
*をユーザーが入力した数字の数...
-
マイナスからプラスへ転じた時...
-
Aの値からBの値を除するとは??
-
2÷3などの余りについて
-
DWORDの実際の型は何でしょうか
-
信頼区間の1.96や1.65ってどこ...
-
カードシャッフルのブログラム...
-
【C++】関数ポインタの使い方
-
エクセルで可視セルにのみ値貼...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
【C言語】全角文字の配列を、全...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
printf による16進表示について
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
C++で指定文字列のカウント方法...
-
コマンドファイルから、ビット...
-
C言語のプログラムで、途中で止...
-
終了条件Ctrl+zについて,結果表...
-
配列への文字列の格納について
-
困ってます!書き方がわかりま...
-
ファイルから数字列を16進数の...
-
fread(),fwrite()等について
-
0x8, スペース, 0x8をプログラ...
-
static付き宣言の初期化
-
構造体メンバの初期化
-
c言語で文書を読み込み、単語の...
おすすめ情報