C言語でのファイルの読み書き方法について
- C言語のストリームを勉強中の私が、fopen(), fread(), fwrite()などの関数を使ったファイルの読み書き方法について困っています。
- 具体的なプログラムの説明とソースコードを記載しています。プログラムは浮動小数点数の配列をファイルに書き込み、再度読み込むものです。
- しかし、実行後にファイルをテキスト形式で開くと文字化けして表示される問題が発生しています。エラーが出ないため原因がわかりません。解決策を教えてください。
- ベストアンサー
fread(),fwrite()等について
私は現在、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@ @ と文字化けして表示されてしまいます。 プログラミング自体勉強するのは今回が初めてで、何がダメなのか見当が付きません。 実行時にエラーが出るわけでもありません。 長くなりましたが、解決策がお分かりの方よろしくお願いします。
- hitosashi
- お礼率80% (70/87)
- C・C++・C#
- 回答数5
- ありがとう数8
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
モードフラグをバイナリ指定しているのでテキスト形式では数値に該当する文字コードの文字が見えてしまいます。 数字をテキストで読めるように書き込みたい場合は,数値を文字列に変換後のほうが良いかと思います。
その他の回答 (4)
- wormhole
- ベストアンサー率28% (1622/5659)
>それでは、このソースコードではmyfile内で文字化けが起こるのは仕方がないと思って良いのでしょうか? そもそも、そのプログラムではmyfileはテキストファイルとして扱ってはいませんから文字化けとか以前の話です。
お礼
回答ありがとうございます。 助かりました。
プログラムの冒頭を 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); に置き換えてコンパイル、実行して表示を確認してください。 それから、テキストファイルとバイナリファイルの違いを勉強しましょう。
お礼
回答ありがとうございます。 勉強し直して理解を深めます。
- Wr5
- ベストアンサー率53% (2177/4070)
>結果が上手く表示されず困っています。 最後のprintf()で正しく表示されているんじゃないですか? 浮動小数点の関係で誤差があるかも知れませんが。 >myfileをテキスト形式で開くと > : >と文字化けして表示されてしまいます。 人間が読める形式で書き出してませんから当然かと。 コンピューターが読みやすい形式と人間が読みやすい形式が同じとは限りません。 人間が読みやすい形式で書き出したいのならば、1つずつprintf()やfprintf()などで書き出して下さい。 write()1回で…というわけには行きません。
補足
回答ありがとうございます。 DOS画面上ではしっかり表示されます。 ただ私の予想では、myfile内でもdouble d[10]が表示されるものだと思っていたので、文字化けして表示されていたので、あれ?って感じでした。 それでは、このソースコードではmyfile内で文字化けが起こるのは仕方がないと思って良いのでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
何がダメなんでしょうか?
関連するQ&A
- fread処理がうまくいかない!!
バイナリエディタでfwriteで書き込んだデータは確認できたのですがfread後のデータがきちんと表示されません。 どうしてでしょうか? #include <stdio.h> void main(void) { char i[] = {'a','b'}; char j[2]; FILE *fpbin; fpbin = fopen("data","wb+"); fwrite(&i,sizeof(char),2,fpbin); fpbin = fopen("data","rb"); fread(&j,sizeof(char),2,fpbin); printf("j = %c\n", j[0]); fclose(fpbin); }
- ベストアンサー
- C・C++・C#
- freadとfwrite
C言語初心者です。 fopenでテキストファイルで読み込んで,freadやfwriteなどは使っていいのでしょうか? 入門書などでは、freadやwriteはバイナリファイルでしか使っていないので疑問になりました。
- ベストアンサー
- C・C++・C#
- fwriteについて
#include<stdio.h> int main(void) { FILE* fp; double f[5]={ 3.1, 2.9, 4.2, 3.7, 4.0}; double data; fp=fopen("test.txt","wb"); if(fp==NULL) { printf("text.txtが開けません。"); return 0; } fwrite(f,sizeof(double),5,fp); fclose(fp); }と入力したのでが、test.txtファイルを見ると 文字化けがでて、数値がわかりません。 数値もテキストファイルに出力する方法があったらご教授よろしくお願いします。できたらなぜこのようなことが起きたのか教えてくださるとうれしいです。
- ベストアンサー
- C・C++・C#
- fread()エラー
お世話になります。 今、バイナリファイルを操作しているのですが、 fread()でエラーになってしまいます。 char buf1[256]; FILE *fp; vector<string> f1; int num; fp = fopen("hoge.txt","r"); while( fgets( buf1, sizeof(buf1),fp ){ f1.push_back( buf1 ); num ++; } fclose(fp); FILE *cfp; unsigned char data[1024]; for(int i=0; i<num; i++ ){ cfp = fopen(f1[i].c_str(), "rb"); fread( data, sizeof(char), 1024, cfp ); } hoge.txtには、コンテンツ場所(パス)が複数記載されており、 その1つずつをfread()で読み込み解析したいのですが、 fread()でセグメンテーション違反になります。 f1の中味をprintf("%s",f1[0].c_str()); で見てみると正常にコンテンツの場所が格納されています。 また、 string pp = "/home/hoge/hoge.txt"; cfp = fopen(pp.c_str(), "rb"); fread(bb,sizeof(char),1024,cfp); とすると正常に動作します。 どうぞよろしくお願い致します。
- 締切済み
- C・C++・C#
- ファイル
AからZまでの文字が何回出力されるか数えるプログラムなのですが、うまく出力されません。 どこを変えればよろしいでしょうか。 #include<stdio.h> #include<stdlib.h> #include<ctype.h> int count[26]; int main(void) { char str[100] = "xyzYZZ\n"; FILE *fp; char *p; int i; char ch; if((fp = fopen("myfile","w")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } p = str; while(*p){ if(fputc (*p,fp) == EOF){ printf("ファイル書き込みエラー"); exit(1); } p++; } fclose(fp); if((fp = fopen ("myfile","r")) == NULL){ printf("ファイルを開くことが出来ません"); exit(1); } while((ch == fgetc(fp)) != EOF){ ch = toupper(ch); if( ch >= 'A' && ch <='Z' ) count[ch - 'A']++ ; } for( i=0 ; i<26 ; i++) printf("%c は %d 回出現\n",i + 'A', count[i]); fclose(fp); return 0; }
- ベストアンサー
- C・C++・C#
- fread関数の使い方がわかりません。
以下のプログラムで試しているのですが、コンパイルはできても各配列の要素が表示されません。なぜなんでしょうか? #include<stdio.h> main() { FILE *fp; int i,b[10]; char a[10]; gets[a]; //ファイル名を指定 fp = fopen(a,"rb"); //バイナリモードでオープン fread(b,3,10,fp); //配列に3byteづつ書き込んだつもり for(i=0;i>=9;i++){ printf("%02x\n",b[i]); //この部分の表示がされない。 } fclose(fp); } レベルの低い質問ですいませんがよろしくお願いします。
- ベストアンサー
- C・C++・C#
- fread関数でわかりません。
fread関数で次のようにソースを記述しました。 FILE *fp; char c[10]; int i; fp = fopen ("./aaa.txt", "rb"); fread(c, sizeof(char)-1, 10, fp); for(i = 0; i < 10; i++) printf("%02x ", *(c+i)); fclose(fp); return 0; aaa.txtの中には 0x1~0xAの10個の数字が記入されています。 cをint 型にすると正常に読み込めるのですが、char型だと 01 00 00 00 02 00 00 00 03 00 となってしまい、正常に読み込めません。 どうも、int型で読み込み、さらに引数 cにはchar *でキャストして渡しているように見受けられます。 Q1 どのようにしたら、char型で 10個一度に読み込めるようになるのでしょうか? Q2 int型(32bit)なら、一度に4文字読み込むと思いますが、何故一文字ずつ読み込むことになるのでしょうか? //getc で一文字ずつ読み込めば済む話ですが、気になり質問いたしました。
- ベストアンサー
- C・C++・C#
- バイナリファイルでランダムアクセスを行う
初心者です。宜しくお願いします。 下記 text.bin にランダムアクセスするサンプルコードで一部理解できない箇所があります。 下から5行目のfreadの一つ目の引数 &num です。なぜ5のポインタなのか初心者にわかりやすく解説頂けないでしょうか? 宜しくお願い致します。 ■text.bin 80 60 22 50 75 ■サンプルコード #include <stdio.h> #define NUM 5 int main(void) { FILE *fp; int num; int i; fp = fopen("/Users/Documents/test1.bin", "rb"); if (fp == NULL) { printf("ファイルをオープンできませんでした。\n"); return 1; } printf("何番目のデータを読み込みますか?(1~5)\n"); scanf("%d", &i); fseek(fp, (i-1)*sizeof(int), SEEK_SET); fread(&num, sizeof(int), 1, fp); printf("%d番目のデータは%dです。\n", i, num); printf("<#message#>"); fclose(fp); return 0; }
- ベストアンサー
- C・C++・C#
- int型の値をファイルに保存
int errint(int errnum){ FILE *fp; if((fp = fopen("error02.txt", "w+b")) == NULL){ printf("ファイルのオープンに失敗しました。\n"); exit(-1); } fwrite(&errnum,sizeof(errnum),1,fp); fclose(fp); } int型の値を受け取ってファイルに 保存する関数を作ったのですが 出力されるテキストが 文字化けしていてうまく動きません。 独習C等の参考書を読んでも自分では分かりませんでした。 どこが間違っているのか教えてください。 よろしくおねがいします。
- ベストアンサー
- C・C++・C#
お礼
回答ありがとうございます。 シンプルで分かりやすかったです。