• ベストアンサー

ファイル関数について

こんばんはです。 次のソースは、構造体の中にファイルから読み込んだDATAを格納する部分です。 ファイルに書き込む際に for(i = 0;i<AllMen;i++){  fputs((person + i)->name,fp);  fputs("\n",fp);//(1)  fputs((person + i)->mail,fp);  fputs("\n",fp);//(1) } fclose(fp); と、上記の様に、(1)のところで無理やり改行をいれて、ファイルに書き込んでます。 fgetsで一行分読み込むとき、nameとmailを分けて取りたいからです。 javaでは、newLineと言うものがあり、\nをしなくてもファイルには 次の行に移動する手段がありますが、Cには無いのでしょうか? fgetsする際に\nがどうしても不都合なのです。 過去に同じ経験のある方、高スキルの方のご回答いただければ嬉しいです。 よろしくお願いいたします。

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

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

No.1です。 すみません、問題点を勘違いしていました。書き込みでなく、読み込みの時が問題なのですね。 No.2の方の書かれているように、\nを除去すればいいと思います。 char *nl;   :   : while(fgets(person[s].name,256,fp) != NULL){ fgets(person[s].mail,256,fp); if ((nl = strchr(person[s].name,'\n') != NULL) { *nl = '\0' if ((nl = strchr(person[s].mail,'\n') != NULL) { *nl = '\0' } s++; } こんな感じでしょうか?(最終行が改行されてない場合\nが入ってこないのでNULLチェックをしてます)

yuki22
質問者

お礼

お返事ありがとうございます。 ソースまで記入いただけるなんて光栄です。 これからもよろしくおねがいします。 本当にありがとうございました^^

その他の回答 (2)

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

出力の際に「データ末尾に '\n' を追加する」なら, 入力のときは「データ末尾の '\n' を削除する」のが筋ではないだろ~か. fgets したあとで *strrchr(それ, '\n') = '\0'; みたいな. あ, もちろんこのままだとコケますので注意.

yuki22
質問者

お礼

お返事ありがとうございます。 お教えいただけたおかげで、無事に求めていた結果を出すことができました。 本当にありがとうございました^^

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

fprintf(fp,"%s\n",(person + i)->name); fprintf(fp,"%s\n",(person + i)->mail); とすればいかがでしょうか。

yuki22
質問者

補足

お返事ありがとうございます。 ファイルへの書き込みは改行されて問題ないのですが、 while(fgets(person[s].name,256,fp) != NULL){ fgets(person[s].mail,256,fp); s++; } で、読込み、さらにそのまま再度ファイル書き込みしますと //ファイルの中1回目 abe abe@ne.jp takahashi takahashi@ne.jp   ↓ //ファイルの中2回目 abe abe@ne.jp takahashi takahashi@ne.jp と、言う風に、間にスペース行が出来てしまいます。 このままfgetsしますと、スペース行が変数に格納されてしまい、 表示に不具合がおきてしまうのです・・。 何かお気付きなことがございましたら、よろしくお願いいたします。

関連するQ&A