- ベストアンサー
ワードのデータ
FILE *fopen( const char *filename, const char *mode ); を使って、 FILE *fp = fopen("あああ.doc", "rb" ); --- c = fgetc(fp); ----- ---- として、エクセルのファイルデータを メモリーに移そうとしたら、 5文字文くらい読んで、 すぐに終了してしまいます。 1.原因は何でしょうか? ワードデータの特性でしょうか? 2.他の方法でファイルサイズをはかり EOF にかかわらず、そのサイズ分だけ読み込めば データをメモリーに移せるのでしょうか? よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
よくある落とし穴ですが、 char c; FILE *fp = fopen("あああ.doc","rb"); --- c = fgetc(fp); --- for (;;) { if (c == EOF) { break; } --- c = fgetc(fp); } fclose(fp); と言うコーディングをしていませんか? 変数 c が char 型だと、文字 0xff を読み込んだ時点で 変数 c が EOF と同値の (char)-1 になり、判定式 (c == EOF) が true と判定され、終了します。 int ic; char c; FILE *fp = fopen("あああ.doc","rb"); --- ic = fgetc(fp); --- for (;;) { if (ic == EOF) { break; } c = (char)ic; --- ci = fgetc(fp); } fclose(fp); 上記のように fgetc の戻り値を int 型変数に格納すれば、文字 0xff を読み込んでも判定式 (ic == EOF) は true とならず、途中で終了したりしません。
その他の回答 (1)
- Tacosan
- ベストアンサー率23% (3656/15482)
#1 に補足しますが, そもそも getchar や fgetc などは全て int を返り値として持ちます. ですから, これらの関数の返り値を受け取る変数は同じく int で宣言しなければなりません.
補足
ありがとうございました。 読み込んだ後の処理が 間違っていました。
お礼
ありがとうございます。 バイナリで開いているので、 原因は別かなと思います。 コードは以下のようになっています。 arg[2] には、ファイル名があります。 FILE * stream1; if( (stream1 = fopen( argv[2], "rb" )) == NULL ) printf( "ファイル 'encrypt0.bin' は開けませんでした。\n"); else printf( "ファイル 'encrypt0.bin' が開けました。\n" ); fseek(stream1,0,0); int c; char bufp[25600]; int i = 0; do{ c = fgetc(stream1); bufp[i]=c; i=i+1; }while(c!=EOF); bufp[i-1]=NULL; for(int j=0; j<(kk/8+2); j++){ bufp[j+i] = NULL; } です。