• 締切済み

オープンモードについて

この下のソースを実行するとファイルの中身が「97へ」と出ます。 この「へ」とは何なのでしょうか?97にしたいのですが、どうすればよいのでしょうか?またなぜこのような結果になってしまったのでしょうか? int main(void) { FILE *fp; int d=97; fp=fopen("txt.txt","w+"); fprintf(fp,"%d",d); fscanf(fp,"%d",&d); printf("%d",d); fclose(fp); return 0; } 環境はVCC++2005です。

みんなの回答

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.7

#4です。 >JIS にはありません (というか ISO/IEC を見ろとしか書いてない) が, ISO/IEC 9899:1999 の Annex J, J.2 Undefined behavior で ありがとうございます。なるほど、さすがはANSI、隙がないですね。 ということは、fflashとかfseekとかをせずに入出力を切り替えた場合は未定義動作なので、へが出ようがミが出ようが知ったこっちゃないということですね。 まあ、どうしてもへが出る理由が知りたいなら、ソースを追うしかないと思います。

  • Quant
  • ベストアンサー率18% (23/122)
回答No.6

97^@ エディタでEOFが表示されているのでは。

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

ご安心ください>#4. JIS にはありません (というか ISO/IEC を見ろとしか書いてない) が, ISO/IEC 9899:1999 の Annex J, J.2 Undefined behavior で The behavior is undefined in the following circumstances とあって, そこに列挙されている「これは未定義動作」一覧にちゃんと - An output operation on an update stream is followed by an input operation without an intervening call to the fflush function or a file positioning function, or an input operation on an update stream is followed by an output operation with an intervening call to a file positioning function (7.19.5.3). とあります. これ自体は Informative ですが, まあ問題ないでしょう.

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.4

う~む、fflashやfseekとかをしなくてはならないとは書いてありますが、 しなかったときにどうなるかまでは書いてないですね。 これが未定義であるとされているなら、なにが起こったとしても規格どおりなんですが。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.3

書き込んだ後の fp はファイルの一番最後を示しています ファイルの最後からさらに読み込みをしようとしてるので何も読み込めていません fseek( )で読み込みたい場所へ移動しないといけません (基本的に読み書きモードで開いたファイルはモードを変える場合にfseek()しないといけません) ファイルの一番最初に戻るなら fseek( fp, 0, SEEK_SET); をfscanf( )の前に実行しましょう 「へ」が表示された理由はわかりません %dで文字が出力されるはずはないのですが

  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.2

97へ ですか? 97> ではなくて?

79562
質問者

お礼

回答ありがとうございます。へです。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

このコードでファイルの中身を取得できているとは思えませんが ・・・ 『へ』についても当方では再現できませんでした おやりになりたいことを以下のコードで確認してみてください int main(void) {   FILE *fp;   int d=97;   int m = 0;   fp=fopen("txt.txt","w+");   fprintf(fp,"%d",d);   // このままでは fscanfは失敗します   // fseekなどを使って移動したあと   // モードの違うファイル操作をしましょう   fscanf(fp,"%d",&m);   printf("%d",m);   fclose(fp);   return 0; } 0 が出力されるでしょう

79562
質問者

お礼

回答ありがとうございます。何とかできるようになりました。ただなぜこのようなことが起きたのでしょうか?

関連するQ&A