以下のようなプログラムを作り、116バイトのファイルのサイズを取得
しようとしているのですが、なぜか100バイトまで読み込んだところで、
feofが真を返し、whileループを抜けてしまいます。
どなたか、原因がわかる方は教えてください。

if((fp = fopen(filename,"r"))==NULL) return;

count = 0;

while(!feof(fp)){
fgetc(fp);
if(ferror(fp)) return;
count++ ;
}

fclose(fp);

このQ&Aに関連する最新のQ&A

A 回答 (2件)

もし、Windows系であるならば、



fopen(filename, "r")

はデフォルトではテキストモードになっていますから、

fopen(filename, "rb")

とすれば、バイナリモードでオープンし、期待どおりなると思います。

テキストモードでは、fgetc は '\r\n' を '\n'1バイトとして取得します。
fputcの場合も、'\n' を '\r\n' 2バイトで出力します。
    • good
    • 0
この回答へのお礼

まさにinthefloiさんのおっしゃるとおりでした。
"rb"で実行したら、ちゃんと動きました。
本当にありがとうございます。

お礼日時:2001/10/18 14:37

外していたらごめんなさい。

(^_^;

もしかしたらファイルは末尾まで読まれているのではないでしょうか。
試しにwhileの中で読み込んだ文字を表示してみて下さい。
countの数が足りないのは改行の数分ではないかと思うのですが…。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qif ( fp == NULL ){ を if ( fp == 0){ へ変更した場合

http://oshiete.goo.ne.jp/qa/8897349.html
 ですが
if ( fp == NULL ){ を
if ( fp == 0){
 fopen dekina と表示してくれるのでしょうか?
  試す環境がございませんので
 よろしくお願いいたします。

Aベストアンサー

>if ( fp == 0){
> fopen dekina と表示してくれるのでしょうか?

はい、表示してくれます。
NULLは、通常、(void*)0 の値が定義されていますので、実体は0と同じです。
しかし、NULLはポインターに対して定義されているのなので、
if ( fp == NULL) と書いたほうがよいでしょう。
一方、0は数値を表すので、
if (fp == 0)とは、書かないほうがよいでしょう。
int a;
が定義されていたとき、
if (a ==0) は、a(という数値を表す変数)の値が0か否かを判断するので、これでよいですが
if ( a== NULL) は、a(という数値を表す変数)の値がNULLか否かを判断するので、
違和感がありますから、使用しないほうが良いでしょう。

Qif(str=='a' || str=='b' || str=='c')これまとめられませんか?

題名どおりなんですが短縮してかけませんか?

Aベストアンサー

Perlなどではこういうのは正規表現で
if ( str =~ /(a|b|c)/ )

なんていうように書けます.
C言語でも正規表現を使うためのライブラリはある
(正規表現,C言語などのキーワードで検索して探してください)
ので,それを探して使うのもありかもしれません.

Qfclose(fp);

FILE *fp;
fp = fopen("xx.txt", "r");
if (fp) {
  ファイルが開けた時のxx.txtを使わない処理
  fclose(fp);
}
else {
  ファイルが開けなかった時の処理
}

これを下のように書き換えると動作が変わりますか?

FILE *fp;
fp = fopen("xx.txt", "r");
fclose(fp);
if (fp) {
  ファイルが開けた時のxx.txtを使わない処理
}
else {
  ファイルが開けなかった時の処理
}

書き換えた場合に動作が変わるかもしれないと思うのは、2つの心配事があるからです。
fclose();という関数が、fpの値を変化させることがあるのか心配。
それと、fclose(fp);によって、fpの指す値が保存されているメモリアドレスが開放されて、
それは他のスレットで使用可能なメモリアドレスということになって、他のスレッドによって
fclose(fp);とif (fp)の間の時間に、fpの値が書き換えられてしまうかもしれないという心配。
この2つの心配は正しい心配ですか?
知識不足のために不要な心配をしているかもしれないと思って質問しました。

FILE *fp;
fp = fopen("xx.txt", "r");
if (fp) {
  ファイルが開けた時のxx.txtを使わない処理
  fclose(fp);
}
else {
  ファイルが開けなかった時の処理
}

これを下のように書き換えると動作が変わりますか?

FILE *fp;
fp = fopen("xx.txt", "r");
fclose(fp);
if (fp) {
  ファイルが開けた時のxx.txtを使わない処理
}
else {
  ファイルが開けなかった時の処理
}

書き換えた場合に動作が変わるかもしれないと思うのは、2つの心配事があるからです。
fclose();という関...続きを読む

Aベストアンサー

fp = fopen("xx.txt", "r");
これで”xx.txt”ファイルがあるとfpにファイルを扱うアドレスが
入り、ファイルが無い時はNULLポインタが入ります。
fclose(fp)を実行するとそのポインタは開放されるので下のソースでは
正常に読むことは出来ないと思います。
普通は
if((fp=fopen("xx.txt","r")) == NULL )
{
ファイルが無い時の処理;
   exit(-1);
}
正常にオープンできた時の処理

Qfp = fopen(argv[1], "r");を”w" "a" "r+"・・・で試したらどうなる

http://oshiete.goo.ne.jp/qa/8897349.html
 以上のプログラムで
 以下をfp = fopen(argv[1], "r");の
 ”r"以外で以下を入れた場合の結果がどうなるかお聞きしたいです。
"r" 読み込みモード。ファイルが存在しているとする。
"w" 書き出しモード。すでにファイルがあれば内容を削除し、なければ新たに作成する。
"a" 追加モード。すでにファイルがあればその最後に追加し、なければ新たに作成する。
"r+" 更新モード。ファイルが存在しているとする。
"w+" 更新モード。すでにファイルがあれば内容を削除し、なければ新たに作成する。
"a+" 追加更新モード。すでにファイルがあればその最後に追加し、なければ新たに作成する。
 以上ですが、試す環境がございませんので、よろしくお願いいたします。

Aベストアンサー

お書きのとおりで合ってますよ。大丈夫です。

Qreturn 0; return 1; まで同じ

#include <stdio.h>
int main()
{
printf("%d %c\n", 65, 65);
return 0;
}
 コンパイル後は
65 A
 return 1;も同じでした。
しかし
 return 2;すると
 Exited: ExitFailure 2  終了しました:出口の失敗2 となります。
 2以上でしたら、出口が塞がるのでろうぐらいしかわかりません!?
 
 どんなバクなのでしょうか!?
 よろしくお願いします。

Aベストアンサー

C 言語の仕事は「0 なり 1 なり 2 なりを返す」までであり, その値にどう対処するかは (「C のプログラム」としては処理を完全に終了しているので) C のあずかり知らぬところです.

なので, 「どんなバクなのでしょうか!?」というのはあなたの使っている OS なりシェルなりなんなりに聞いてください.


人気Q&Aランキング

おすすめ情報