• ベストアンサー

ファイルへの書き込み

ループ内で、10進数数字(文字コード)をchar型変数に入れ、指定文字アペンド(a)を使用して文字をファイル(.txt)に出力したいのですが、うまくできません。fputc関数で作成したファイルをみると、必ず最後の文字が先頭に記述されます。 例)(※文字コードは手持ちの開発環境でのもの) 「65」「66」「83」の順に「MOJI」に入れると「printf」で標準出力されるのは「A」「B」「S」の順なのですが、ファイルにはなぜか「SAB」の順になっています。 以下プログラムで行いました。(必要不可欠なものでも決まり文句等を含め、一部省略しています) ~略 FILE *fp; char MOJI; int SUUJI; while(・・・) { ~略~ MOJI = SUUJI; printf("%c\n",MOJI); fp = fopen("・・・.txt","a"); fputc(MOJI,fp); } ~以下略 元々このような機能なのでしょうか。 原因と解決方法を教えていただければと思います。 よろしくお願いします。

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

  • ベストアンサー
  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.4

確認しました。fclose()の位置ですね。 おそらく、whileの外でfclose()しているのでしょう。 whileの中で毎回fclose()してください。 while(・・・) { ~略~ fp = fopen("・・・.txt","a"); fputc(MOJI,fp); fclose(fp); } です。 質問者のプログラムでは (whileの中) ・ファイル1を開く ・ファイル1の末尾にAと書こうとする(この時点ではファイルには書かれない) ・ファイル2を開く(ファイル1と同名) ・ファイル2の末尾にBと書こうとする(この時点ではファイルには書かれない) ・ファイル3を開く(ファイル1と同名) ・ファイル3の末尾にSと書こうとする(この時点ではファイルには書かれない) (whileここまで) ・ファイル3を閉じる(ここで実際にSと書かれる) ・プログラム終了 ・ファイル1が開いているので自動的に閉じる(ここで実際にAと書かれる) ・ファイル2が開いているので自動的に閉じる(ここで実際にBと書かれる) という動作になります。 コンパイラによって、1と2の閉じる順番が逆になるかもしれません。

AVATAR
質問者

お礼

ご回答ありがとうございます。ご指摘の方法にて解決できました。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.5

ループの中にfopenがあって、しかもfcloseしていません。 1つのファイルを複数並行してfopenで操作すると、何が起きるか解りません。バッファ処理の関係でご質問のような挙動をする可能性もあります。 whileループの外でfopenを行ってください。 1つのプログラムの中で1つのファイルを複数回openするのは、ややこしい応用ワザですので初心者のうちは「してはいけないことだ」と思っておいた方が良いです。

AVATAR
質問者

お礼

ご回答ありがとうございます。ループ外でのfopenで解決できました。

すると、全ての回答が全文表示されます。
  • FAY
  • ベストアンサー率49% (95/193)
回答No.3

fp = fopen("・・・.txt","a"); の後に fseek(fp, 0, SEEK_END); とか。

AVATAR
質問者

お礼

ご回答ありがとうございます。ご指摘の方法でも解決できました。

すると、全ての回答が全文表示されます。
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

よくわかりませんが、 while に入る前にfopen してみたらどうでしょうか

AVATAR
質問者

お礼

ご回答ありがとうございます。その方法で解決できました。

すると、全ての回答が全文表示されます。
回答No.1

略しすぎで些か不明ですが、fopen()に対してfclose()は行なっていますでしょうか。 fclose()せずにfopen()することと"SAB"になることとの因果関係は不明ですが、 少なくとも関係がある可能性はありますのでご確認ください。

AVATAR
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A