- ベストアンサー
ファイルに文字列を書く方法と改行の制御
- ファイルに文字列を書く方法と改行の制御について説明します。
- ファイルを2つ読み込んでファイルを書き直そうとした際に、改行の書き込みがおかしくなる問題が発生します。改行を一回だけする方法についても解説します。
- 質問者が求める要点は、ファイルに文字列を書き込む方法と、改行を一回だけする方法です。これらについて詳しく説明します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
最初に書いたときに、「余計な改行」が付く ↓ 次に読むのは、その「余計な改行」が付いたファイル それを出力するときに、また「余計な改行」が付く ... を繰り返してるんじゃないですか? このchat_data.txt を、コピーして次はmoto.txt にしてるとか無いですか? あと > tm[999] = (char*)malloc(strlen(buf+1)); これ、1000行以上あると、解放できませんね。
その他の回答 (2)
- Tacosan
- ベストアンサー率23% (3656/15482)
fgets の仕様については既に指摘されているところだったりします. cf. http://okwave.jp/qa/q7819645.html そしてこのプログラムにもしっかりバグが入っている. ところで if(i!=(sei-1)){ fprintf(fp,"\n"); } における if の存在意義ってなんだろう.
お礼
ちなみに5個なら tm[0] tm[1] \n tm[2] \n \n tm[3] \n \n \n tm[4] となります tmを個と数えましたが 正確にはプログラムを数回起動させて処理したときの個数のときになります tm[0] \n tm[1] \n tm[2] \n tm[3] \n tm[4] \n 上の感じならfgetsのバグだと私も思うんですけどね 以前もあったので
補足
これは全体の一部をくりぬいて質問用のプログラムにしているのですが、元のプログラムは一行だけ他と違うように変える必要があったのです そのためへんなプログラムに見えたらすみませんね もう少しバグについて話すならtmが2つだけなら問題がなく 3個なら tm[0] tm[1] \n tm[2] 4個なら tm[0] tm[1] \n tm[2] \n \n tm[3] となってしまいます
- m-take0220
- ベストアンサー率60% (477/782)
fgetsは読み込んだデータの改行をそのまま残すので、そのデータに対して改行を付加して書き込めば、当然改行が二重になります。
補足
えっと読み込んだときには待ったく問題なく表示されたのですが、書き込むときにはおかしくなっちゃうのです
補足
<<最初に書いたときに、「余計な改行」が付く ↓ 次に読むのは、その「余計な改行」が付いたファイル それを出力するときに、また「余計な改行」が付く ... を繰り返してるんじゃないですか? まさしくそんな感じですね もしかしたら余計な改行を入れていたのが原因かもしれませんね もう一度ソースを見直してみますね <<このchat_data.txt を、コピーして次はmoto.txt にしてるとか無いですか? 言われてきづいたのですが質問用のプログラムとして書いたときに変更し忘れていました chat_data.txtではなくmoto.txtと書き換えてください そのためおかしな質問をしていました 申し訳ありません >>あと > tm[999] = (char*)malloc(strlen(buf+1)); これ、1000行以上あると、解放できませんね。 1001行目をなしにするつもりで書きました ちょっとここら辺はこのバグを何とかしたらちゃんと1000行になるか確認したかったので、ちゃんとできてる傘は確認してません