• ベストアンサー

ファイル関数について

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

  • yuki22
  • お礼率83% (159/190)

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

  • ベストアンサー
  • 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

  • なぜか Return-Path がechoできない

    メールボックスにあるメールを受信してブラウザに表示したいのでが なぜか、Return-Path の部分のメールアドレスが表示されません。 下記ソースなのですが、どこがいけないのかご教授ください postfix 使ってます <? // ------------------------------------------------- $user = 'a@hoge.ne.jp'; $pwd = 'hoge'; $host = "hoge.ne.jp"; $port = 110; $fp = fsockopen($host, $port); // ログイン $line = fgets($fp, 512); fputs($fp, "USER $user\r\n"); // USER名 $line = fgets($fp, 512); fputs($fp, "PASS $pwd\r\n"); // パスワード $line = fgets($fp, 512); // ログイン失敗? if(!eregi("OK", $line)){ fclose($fp); echo 'ログイン失敗'; exit; } // メールボックス内のデータを取得 fputs($fp, "STAT\r\n"); $line = fgets($fp, 512); list($stat, $num, $size) = explode(' ', $line); // データがない? if(0+$num == 0){ fclose($fp); echo 'メールはありません'; exit; } // それぞれ受信して、配列に納める for($id=1;$id<=$num;$id++){ fputs($fp, "RETR $id\r\n"); $line = fgets($fp); $msg[$id] = ""; while(!eregi("^\.\r?\n",$line)){ $line = fgets($fp, 512); echo $line.'<br>'; } } fputs($fp, "QUIT\r\n"); fclose($fp); ?>

    • ベストアンサー
    • PHP
  • fpus:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • fputs:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

  • ファイルへの書き込み

    フォームに入力されたデータをCSVファイルに書き込みたいのですが、以下のようにすると追加で書き込みはできるのですが、ずっと改行されずに1行に書き込まれてしまうので、新しいデータを入れる際に改行されるようにしたいのですが、どのようにすればいいでしょうか? $fp = fopen(TEST_FILE,"a") or die("ファイルを開けません\n"); flock($fp, LOCK_EX); fputs($fp, "aaa")."\n"; flock($fp, LOCK_UN); fclose($fp);

    • ベストアンサー
    • PHP
  • C言語、ファイル操作、fgets()について

    次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。     80でも良いような気がするのですが・・・

  • テキストエリアの改行について

    PHP初心者です。 今、PHPで掲示板を作成しています。 下記のように テキストエリアで複数行文字を打っても、 1行で表示されてしまいます。 -----入力----- <textarea> Test Test </textarea> -----出力----- Test Test -------------- どうしたら、改行が反映されるのでしょうか? プログラム貼り付けておきますね! -------------------------------- <form method="post" action="<? echo $PHP_SELF; ?>"> 名前<br><input name="name" type="text" size="10"><br> コメント<br><textarea name="mes" rows="10" cols="50"></textarea><br> <input type="submit" value="送信"><input name="del" type="submit" value="RESET"><br> <?php extract($_POST); /* 設定 */ $ip = getenv("REMOTE_ADDR"); //IPアドレスを取得 $logfile = "bbs.log"; //ログファイル名 $viewmax = 10; //表示行数 $logmax = 10; //保存最大行数 $n_fp = fopen("num.log","r+"); $num = fgets($n_fp, 32); //現在のNo.を取得 /* リセット処理 */ if($del){ $bbs = fopen("bbs.log","w"); //BBSログを消去 fclose($bbs); fclose($n_fp); //ファイルを閉じる $nc_fp = fopen("num.log","w"); //num初期化 $num = 1; fputs($nc_fp, $num); //書き込み fclose($nc_fp); //ファイルを閉じる } /* 書き込み処理 */ if($name && $mes){ /* HTMLタグをエントリに変換 */ $mes = htmlspecialchars ($mes); $name = htmlspecialchars ($name); /* Shift-JISの場合バッククォートを除去 */ if(get_magic_quotes_gpc()){ $mes = stripslashes($mes); $name = stripslashes($name); } /* \nを<br>に変換する */ if($mes == "\n"){ $mes = str_replace("\n", "<br>", $mes); } /* 日付けのフォーマット */ $now = gmdate("d(D) H:i ",time()+60*60*9); /* ログのフォーマット */ $dat = "$name<br>└ $mes <font size=\"1\">[$now]</font><br>($ip)<br>\n"; /* ログに書き込む */ $lines = file($logfile); //いままでのログを配列に読み込む $fp = fopen($logfile, "w"); //ログをオープン(空になる) fputs($fp,"[$num] $dat"); //データを書き込む(先頭に) for($i = 0; $i < $logmax-1; $i++) //いままでの分を追記 fputs($fp, "$lines[$i]"); //(配列0-98→現ログ1-99行目) fclose ($fp); $num++; fseek($n_fp, 0); // ポインタを先頭に戻す fputs($n_fp, $num); // 書き込み fclose($n_fp); // ファイルを閉じる } /* 表示処理 */ $lines = file($logfile); for($i = 0; $i < $viewmax; $i++) echo $lines[$i]; ?> </form>

    • ベストアンサー
    • PHP
  • 何がおかしいのでしょうか?

    $filename1 = 'ymd.dat'; $fp1 = fopen($filename1, "r+"); $day2 = fgets($fp1,9); $day = date('Ymd'); //今日のアクセス数カウント。日付が変われば0になる。 $filename2 = 'ymd2.dat'; $fp2 = fopen($filename2, "r+"); $count2 = fgets($fp2,32); if($day==$day2){ $count2++; fseek($fp1, 0); fputs($fp1, $day); fclose($fp1); }else{ $count2 = 0; fseek($fp1, 0); fputs($fp1, $day); fclose($fp1); } fseek($fp2, 0); fputs($fp2, $count2); fclose($fp2);

    • 締切済み
    • PHP
  • fgetsの使い方について

    こんばんわ。phpでラジオボタンを使用して投票フォームを作っています。 投票した値をログファイルに書き込んで4項目をカウントできるように格納したいのですが、エラーも出ずにスルーして原因がわからず困っています。 イメージでは ログファイル↓ 24 もちろん 11 するかも 5  わからない 12 ない 問題のソースは以下の通りです。 $write = "$radiobutton"."\n"; $fp = fopen("../php/test1.txt","a+"); $line1=fgets($fp); $line2=fgets($fp); $line3=fgets($fp); $line4=fgets($fp); fputs($fp,$write); fclose($fp); print "fgets1回目=".$line1."<br>\n"; print "fgets2回目=".$line2."<br><br>\n"; print "fgets3回目=".$line3."<br><br><br>\n"; print "fgets4回目=".$line4."<br><br><br><br>\n"; わかる方いましたらご教授お願いします。

    • ベストアンサー
    • PHP
  • ファイルについて・・・。

    お願いいたします。 以下のソースは"samplefile.txt" が前提としてあることになって いますが、もしなかった場合このテキストファイルを作り出す仕組みをソースに加えたいんですが・・・。 2,3行目の間に「もしファイルがみあたらない時は・・」みたいな条件をつける??くらいしか自分の頭では思い浮かばず・・・ 何かアドバイスいただけないでしょうか??お願いいたします。 1 <?php 2 $fp = fopen("samplefile.txt", "a+"); 3 $count = fgets($fp, 15); 4 $count = $count++; 5 rewind($fp); 6 fputs($fp, $count); 7 fclose($fp); 8?> 9<p>あなたは <?php echo $count; ?> 人目のお客様です。

    • ベストアンサー
    • PHP
  • ファイル入出力について教えて下さい。2

    ご覧いただきありがとうございます。 何度も低レベルな質問で申し訳ありません。 A.PRMというファイルに、 I have a pen. He has a pen. と2行の文章が入っています。 これを読み取り、printfで画面表示させたいのですが、 #include <stdio.h> int main(void) { FILE *fp; char a[50]; char b[50]; if( (fp=fopen("A.PRM", "r" )) != EOF ) { fgets( a, 49, fp ); fgets( b, 49, fp ); } fclose( fp ); printf( "a = %s\n", a ); printf( "b = %s\n", b ); return 0; } とすると、fgetsで余分な改行が入ってしまいます。 fgetsの代わりにfscanfを使用すると、今度はスペースの前までしか読み込んでくれず、「a = I」「b = He」と表示されてしまいます。 どうしたらよいでしょうか? 是非ご回答いただきたいです。よろしくお願いいたします。

専門家に質問してみよう