• ベストアンサー

ワードのデータ

FILE *fopen( const char *filename, const char *mode ); を使って、 FILE *fp = fopen("あああ.doc", "rb" ); --- c = fgetc(fp); ----- ---- として、エクセルのファイルデータを メモリーに移そうとしたら、 5文字文くらい読んで、 すぐに終了してしまいます。 1.原因は何でしょうか?   ワードデータの特性でしょうか? 2.他の方法でファイルサイズをはかり   EOF にかかわらず、そのサイズ分だけ読み込めば   データをメモリーに移せるのでしょうか?  よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.1

よくある落とし穴ですが、 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 とならず、途中で終了したりしません。

uyama33
質問者

お礼

ありがとうございます。 バイナリで開いているので、 原因は別かなと思います。 コードは以下のようになっています。 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; } です。

その他の回答 (1)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

#1 に補足しますが, そもそも getchar や fgetc などは全て int を返り値として持ちます. ですから, これらの関数の返り値を受け取る変数は同じく int で宣言しなければなりません.

uyama33
質問者

補足

ありがとうございました。 読み込んだ後の処理が 間違っていました。

関連するQ&A