
私は現在、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キーを押されたら次の処理...
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
困ってます!書き方がわかりま...
-
c言語で文書を読み込み、単語の...
-
なぜ無限ループになるかが分か...
-
c言語 プログラム
-
Cでファイルの行数をカウントす...
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
【C言語】全角文字の配列を、全...
-
fread(),fwrite()等について
-
ビルドエラーの対処がわからな...
-
fwrite処理について
-
C言語について質問です。読み取...
-
タイムカードのシステムを作り...
-
ファイル操作で全角空白を消す
-
文字列の入力
-
WinInetのInternetOpenUrl関数...
-
プログラミングの授業の課題です
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
#defineが使用するメモリ領域に...
-
【C言語】全角文字の配列を、全...
-
printf による16進表示について
-
reallocでエラー
-
構造体メンバの初期化
-
空白を含んだ文字列がうまく格...
-
矢印キーを押下してコンソール...
-
char型2つを結合し、short型に...
-
C言語のシリアル通信について
-
構造体の配列のアロケート等の方法
-
プログラミングの授業の課題です
-
C言語で複数列のデータを1列の...
-
エラーについて質問です。
-
WinInetのInternetOpenUrl関数...
-
警告 W8075 問題のあるポインタ...
-
C++で指定文字列のカウント方法...
-
ごみが入りますか?
-
ファイルを辞書順に並べ替える...
-
ファイル入力のエラー
おすすめ情報