重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

こんばんはです。
次のソースは、構造体の中にファイルから読み込んだ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がどうしても不都合なのです。
過去に同じ経験のある方、高スキルの方のご回答いただければ嬉しいです。
よろしくお願いいたします。

A 回答 (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チェックをしてます)
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/07 18:12

出力の際に「データ末尾に '\n' を追加する」なら, 入力のときは「データ末尾の '\n' を削除する」のが筋ではないだろ~か. fgets したあとで


*strrchr(それ, '\n') = '\0';
みたいな. あ, もちろんこのままだとコケますので注意.
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/07 18:10

fprintf(fp,"%s\n",(person + i)->name);


fprintf(fp,"%s\n",(person + i)->mail);

とすればいかがでしょうか。

この回答への補足

お返事ありがとうございます。
ファイルへの書き込みは改行されて問題ないのですが、

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しますと、スペース行が変数に格納されてしまい、
表示に不具合がおきてしまうのです・・。
何かお気付きなことがございましたら、よろしくお願いいたします。

補足日時:2006/11/06 17:36
    • good
    • 0

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