私は現在、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.2
- 回答日時:
>結果が上手く表示されず困っています。
最後のprintf()で正しく表示されているんじゃないですか?
浮動小数点の関係で誤差があるかも知れませんが。
>myfileをテキスト形式で開くと
> :
>と文字化けして表示されてしまいます。
人間が読める形式で書き出してませんから当然かと。
コンピューターが読みやすい形式と人間が読みやすい形式が同じとは限りません。
人間が読みやすい形式で書き出したいのならば、1つずつprintf()やfprintf()などで書き出して下さい。
write()1回で…というわけには行きません。
この回答への補足
回答ありがとうございます。
DOS画面上ではしっかり表示されます。
ただ私の予想では、myfile内でもdouble d[10]が表示されるものだと思っていたので、文字化けして表示されていたので、あれ?って感じでした。
それでは、このソースコードではmyfile内で文字化けが起こるのは仕方がないと思って良いのでしょうか?
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);
に置き換えてコンパイル、実行して表示を確認してください。
それから、テキストファイルとバイナリファイルの違いを勉強しましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
#defineが使用するメモリ領域に...
-
Enterキーを押されたら次の処理...
-
終了条件Ctrl+zについて,結果表...
-
プログラムC
-
csvファイルの読み取り
-
setjmp・longjmpに関しまして
-
static付き宣言の初期化
-
2÷3などの余りについて
-
信頼区間の1.96や1.65ってどこ...
-
std::set<int> で、ある値が何...
-
「Aに対するBの割合」と「Aに対...
-
ウィンドウハンドルがメッセー...
-
プログラムでの数字につく”f”の...
-
ある商品のロス率を5%見込み、...
-
10進数からN進数に変換するプロ...
-
O(n log n)について2
-
ループを途中で抜けたいのですが。
-
C#のコンパイルエラーCS0120に...
-
float型とdouble型の変数の違い...
-
数学のテストからの質問(反比例)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Enterキーを押されたら次の処理...
-
printf による16進表示について
-
#defineが使用するメモリ領域に...
-
C言語で複数列のデータを1列の...
-
C言語のプログラムで、途中で止...
-
reallocでエラー
-
【C言語】全角文字の配列を、全...
-
構造体メンバの初期化
-
char型2つを結合し、short型に...
-
空白を含んだ文字列がうまく格...
-
VC++でSQLへSELECT文を送ったの...
-
C言語でのCSVファイルの読み出...
-
エラーについて質問です。
-
setjmp・longjmpに関しまして
-
矢印キーを押下してコンソール...
-
タイムカードのシステムを作り...
-
大量のファイルを読み込み、そ...
-
C言語、ファイル操作、fgets()...
-
Cでファイルの行数をカウントす...
-
リストの作成と出力(C言語)
おすすめ情報