• ベストアンサー

windowsで書き込んだファイルをサーバーに送ると改行が追加され2行のデータになる。

QNo.1112250ディストリビューション質問をさせていただいたものです。 windowsで作成したファイルをサーバーに送り、PHPでデータを読み込むと空の行が追加されます。 1)windowsでのデータは「"name",111」ですが、エディター(TeraPad)で下記のように表示されます。([EOF]が1行下に表示されます。) "name",111 [EOF] 2)このデータをサーバーに転送し下記のように読み出すと2行分のデータとして読まれます。2行目は空のデータになっています。 while(!(feof($fp))){ $buf=fgets($fp,100);      $buf=chop($buf); $data=split(",",$buf); $name[$count]=$data[0]; $password[$count]=$data[1]; 空の行を読まないようにする方法をご教示いただけませんか。よろしくお願いします。

  • PHP
  • 回答数6
  • ありがとう数4

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

  • ベストアンサー
  • gimmick
  • ベストアンサー率49% (134/270)
回答No.4

>最終行の後に追加されていました。 もしかしたら、最終行を読んだ時点ではEOFにならないのかもしれませんね。その次のfgets()でEOFになるのかな? そうだとすると、読み込んだ行データがブランクの場合にcontinueかbreakすればよさそうです。 while(!(feof($fp))){  $buf=fgets($fp,100);  if($buf=="") {   continue;  }

miya2003
質問者

お礼

解決いたしました。大変助かりました。ありがとうございます。今後もよろしくお願いいたします。

miya2003
質問者

補足

ありがとうございます。 この方法で試してみます。結果は後で報告させていただきます。

その他の回答 (5)

noname#223623
noname#223623
回答No.6

ひさしぶりにPHPやりました。gimmickさんのおっしゃるとおりです。 対応はそれでいいと思いますが、ちょっと私なりに理屈を考えたので書かせて下さい。専門家ではないので間違っているかもしれませんが(間違っていたら誰か指摘下さい)。 ポイントはwhileがfeofを評価するタイミングとファイルポインタの位置の関係です。 質問文で書かれているファイルですが、書き換えると「"name",111[EOF]」となりますね。ファイルを開いたとき、ファイルポインタは先頭にあります。ファイルポインタを!で表すと「!"name",111[EOF]」の位置です。 whileでfeofを評価するとfalseなのでループに入り、fgetsでファイルを読み込みます。同時にファイルポインタが「"name",111![EOF]」に移動します。 1回目の処理が終了して、2回目のループ判定に入ります。ファイルポインタはまだEOFの前にいます。したがってfeofの結果はfalseになり2回目のループに入ります。 先ほどと同じようにfgetsでファイルを読み込みます。ファイルポインタは「"name",111[EOF]!」に移ります。 というわけでfeofの結果がtrueになるのは3回目の判定なんですね。

miya2003
質問者

お礼

ありがとうございました。今回は、gimmickさんに教えていただいた方法で解決しました。ファイルポインタという概念があるのを教えていただき今後の参考になります。 今回のwindowsからのデータはVBで作成したアプリからのものでして、混乱させて申し訳ありませんでした。 VBでのデータは["]をnameの前後につけていますがこれが邪魔になり、手作業で["]のないデータを使用すると邪魔になりませんがこの件は別件で質問させていただきます。 今後もよろしくお願いいたします。

noname#223623
noname#223623
回答No.5

急にVBの話が出てきて混乱しております。PHPの話ですよね。 テストデータを作るだけなので手作業でいいんじゃないですか? それともVBの話するひつようあるのかしら???

miya2003
質問者

補足

混乱させてすみません。windowsで作成したファイルはVBのアプリから作成していました。テストデータを手作業で作成してみると空のデータがでませんでした。 VBは別の話でしたね。ありがとうございます。

noname#223623
noname#223623
回答No.3

この質問ではよくわからないことがあります。改行が追加されるのは最終行のあとなのでしょうか。それとも各行の間に追加されるのでしょうか。サンプルが1行なのでどちらか判断できないです。 元のデータを複数行にして確認してください。この場合は次のどちらになるでしょう。 1. 最終行の後に行が追加される 2. 各行で行が追加される まあ、改行コードの問題だと思いますが。

miya2003
質問者

補足

早速のご回答ありがとうございます。 最終行の後に追加されていました。よろしくお願いします。

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

ファイルの改行コードが\r\nになっているせいだと思います。 サーバでfgets()した時に\rと\nが1つの改行コードとして認識されているのでしょう。 対処方法としては  (1)可能であればテキストモードでオープンする  (2)ファイルの改行コードを\nにしておく といった事が考えられます。 #PHPを知らないので間違っているかもしれません。

参考URL:
http://php.s3.to/man/function.fopen.html
miya2003
質問者

補足

早速のご回答ありがとうございます。 オープンするときにテキストモードにするために下記のようにしてみましたが変化はありませんでした。 $fp=fopen($fileName,"r");⇒$fp=fopen($fileName,"rt") また改行コードを\nにしてみましたが変化はありませんでした。もう少し調べてみます。

  • gatyan
  • ベストアンサー率41% (160/385)
回答No.1

111のあとに改行を入れていると思いますが、改行を入れないとどうなるか試してみました?

miya2003
質問者

お礼

空行を検出することで解決いたしました。ありがとうございました。今後もよろしくお願いいたします。

miya2003
質問者

補足

早速のご回答ありがとうございます。 VBで作成したアプリから下記のように書き込んでいまして、改行を意識していないのですが。 Open FileName For Append As #intFileNo Write #intFileNo, Name, password Close #intFileNo vbで改行コードを入れたり、外したりできるのでしょうか。

関連するQ&A

  • ブラウザから登録したサーバー内のデータが改行されない

    ブラウザから名前とパスワードを入力し、PHPのスクリプトで下記のように コンマをいれて最後に改行を追加しました。 $string= $_POST['name'].",".$_POST['password']."\n"; fputs($fp,$string); サーバーに複数回、書き込まれたデータをメモ帳で見ると、下記のように改行されずに、一行になります。そして改行の代わりに■がつきます。 name1,1111■name2,1111■ (メモ帳の上記のようなデータをコピーしてここに貼り付けると2行に改行されました)下記参照ください。 name1,1111 name2,2222 この書き込まれたファイルをクライアントのハードデスクに保存し、開いて読み出すと、一行目は正しく読めますが、2行目が読めません。正しく書き込む方法を教えていただけませんか。 よろしくお願いします。 なお、レンタルサーバーのPHP4を使用しています。

    • ベストアンサー
    • PHP
  • 他のサーバーのファイルを大量に読み込んだら迷惑?

     他のサーバーにアクセスして、大量のhtmlファイルを開き、fgets()でそれらを読み込んだら、相手方のサーバーには迷惑になるでしょうか?  (以下のような感じです。URLの部分は、hを大文字で記述しています) <?php $fp = fopen("http://somewhere.org/page1.html","r"); while(!feof()){ $line = fgets($fp); fwrite($fp,$line); } fclose(); $fp = fopen("http://somewhere.org/page2.html","r"); while(!feof()){ $line = fgets($fp); fwrite($fp,$line); } fclose(); //・・・これを数十回くらい。 ?>  又、迷惑になる場合、ファイルを1つ読み込んだあと、sleep();で何秒か停止すれば迷惑かけずに済むでしょうか? もしそうなら、大体何秒くらいでしょうか?

    • ベストアンサー
    • PHP
  • PHPとJavascriptの連携

    こんにちは。 PHPとJavascriptの連携について質問があります。 ↓のコードは、 (1)PHPの側で、test.csvというCSVファイルからデータを配列に読み込み、 (2)その配列データをJavascriptに渡し、 (3)カウンター番号の配列データをHTMLのTextに表示させる という流れを意図したものです。 しかし、$question[]配列がJavascriptにうまくわたっていないようで、エラーになります。 発想自体に問題があるのか、表現の仕方がまずいのか、ご指摘いただきたくよろしくお願い申し上げます。 *************************************↓コード <script language="Javascript"> var $question = new Array(); var n = 0; function disp() { document.myform.mytext.value = $question[n]; //Textに$question[n]を表示させる n++; } </script> //------------------------------------------------------------------------ <form name="myform" > <input name="mytext" type="text"><br> <input name="mybutton" type="button" value="click" onclick="disp(this)"> </form> //------------------------------------------------------------------------ <?php $fp = fopen("test.csv", "r"); //CSVファイルを開く $count = 0;           //カウンターを初期化する while(!(feof($fp)))       //ファイルの終端まで読み込む { $buf = fgets($fp, 1024); $buf = chop($buf); //文末にある改行文字を削除する $data = split(",", $buf); // , ごとに区切って配列に格納する $question[$count] = $data[0]; //question[]配列に$data[0]を格納する $answer[$count] = $data[1]; //answer[]配列に$data[1]を格納する $count++; //カウンターを1進める } fclose($fp); ?>

    • ベストアンサー
    • PHP
  • csvファイルに複数行あるデータの取り込め方は?

    環境はxp、apache2、php5、Postgresql8.2です。 1台のPCをサーバ&クライアントにしています。 ただ今PHPとPostgresqlの勉強をしています。 いつも質問に答えてくれてありがとうございます。 以下のようにしてcsvファイルを読み込む処理をしています。 --------------------------- //ファイルを開く $fd = fopen ("c:\Book5.csv", "r"); //データを読み込む while (!feof ($fd)) { //「,」区切りでデータを分割 $line = split(",",fgets($fd)); --------------------------- ここで問題となるのは、 一つのデータに複数行ある場合、取り込む事が出来ません。 (行の最後と判断されるため?) どのようにしたら 取り込めますか?

    • ベストアンサー
    • PHP
  • PHPでCSVファイルの特定行のみ表示

    PHPでCSVファイルを読み込ませるにあたり、「クエリで指定した特定の1行だけ」を取りだしたいと考えています。 下記だと、1行目からクエリで指定した特定行までの抽出が可能です。 hoge.php?repert=5  → 1から5行目までが表示される。 従い、下記から特定行より上の行を削除すれば、当方が考えている「クエリで指定した特定の1行だけ」を取りだすことになりますが、その方法がわかりません。 ご教示いただきたくお願いいたします。 <?php $repeat = $_GET['repert']; $fp = fopen("file2.csv", "r"); $count = 1; while ($data = fgetcsv($fp, 10000)) { if ($count > $repeat) { break; } print <<<EOD $data[0]・$data[1]・$data[2]<br> EOD; $count++; } fclose ($fp) ?>

    • ベストアンサー
    • PHP
  • EOF判定されない

    if(fgets(buff, 21, fp) == NULL) {   if(!feof(fp))   {     rtn_code[0] = '8';   }   else   {     rtn_code[0] = '4';   } } -------------------------------------- /入力ファイル/ -------------------------------------- 1行目 AAAAABBBBBCCCCCDDDD[LF] 2行目 EEEEEFFFFFGGGGGHHHH[LF] 3行目 [EOF] -------------------------------------- [LF]=改行文字です。 [EOF]=ファイル終端指示子です。 上記のプログラムは、 1行20バイトある入力ファイルから一行だけgetするサブモジュールの一部です。 3回目にこれを実行した時に、EOFになってrtn_codeが'4'で返ってくる予定なのですが、どうしても非EOFになって'8'が返ってきてしまうのです。 なぜなんでしょうか? そもそも、どうなるとEOF指示子がfpに返ってくるのでしょう?

  • c言語  2つのファイルを行ごとに読み込むプログラミング

    c言語  2つのファイルを行ごとに読み込むプログラミング 0.txt と 1.txt という2つのテキストフォルダがあり 0.txt の中身は a a b b 1.txt の中身は c c d d というものとします。 これら2つのフォルダを読み込むとき まず1つのフォルダの1行目(a a)を表示し 他方の1行目(c c) 2行目(d d)を表示させて 続いて1つのフォルダの2行目(b b)を表示し 他方の1行目(c c) 2行目(d d)を表示させたいのです。 つまり実行結果が a a c c a a d d b b  ←理想の実行結果です c c b b d d となるようにしたいのですが #include <stdio.h> #include <stdlib.h> #define STR_MAX 256 int main(void) { FILE *fp, *fp2; int i, j, k; char buf[STR_MAX]; char buf2[STR_MAX]; fp = fopen("0.txt", "r"); fp2 = fopen("1.txt", "r"); if (fp == NULL && fp2 == NULL){ printf("\n"); } while(fgets(buf, STR_MAX, fp) != NULL){ while(fgets(buf2, STR_MAX, fp2) != NULL){ printf("%s%s", buf,buf2); } printf("\n"); } fclose(fp); fclose(fp2); return 0; } このプログラミングの実行結果は a a c c a a d d となり、0.txtの2行目(b b)は表示されません。 おそらく while 文 を2重にすることで 不具合が起きているのだと思うのですが 色々と調べた結果、これ以外に プログラミングが思いつきません。 私の理想の実行結果にするためには どこを訂正させると良いのでしょうか? 恐れ入りますが ご回答 どうかよろしくお願いいたします。

  • テキストデータから指定した1行を抜き出して表示

    perl初心者です。 説明不足の箇所もあるかと思いますが、よろしくお願いします。 テキストデータから指定した1行を抜き出して表示するのにはどうしたらいいんでしょうか。 data.txtの中に=で区切られた文字が入っているとします。 1=にんじん=150 2=じゃがいも=200 3=たまねぎ=100 左から$s_no,$s_name,$s_priceという変数になっています。 これを print <<"EOF"; <TABLE class="list_index"> EOF open(IN,"../indata/sdeta.txt"); @data = <IN>; close(IN); foreach $sdata (@data){ chop($sdata); ($s_no,$s_name,$s_price) = split (/=/, $sdata); print <<"EOF"; <TR> <TD class="list2">$s_no</TD> <TD class="list3">$s_name</TD> <TD class="list4">$s_price円</TD> <TR> EOF } print <<"EOF"; </TABLE> EOF という感じでテーブルにデータを全て一覧表示させました。 ここから、$s_noで表示されている「1」「2」「3」をクリックすると、 別ページにとんで、クリックした番号の1行を編集用のフォームに表示させたいです。 フォームに表示させる方法はわかっているんですが、 クリックで指定した1行だけを表示する方法がわからずに困っています。 よろしくお願い致します。

    • ベストアンサー
    • Perl
  • 改行コードだけの行が現れるまでを1行として取得

    PHPでインプットファイルから、 改行コードだけの行が現れるまでを1行として取得しようと思っています。 下記例のように、 fgetsで行を取得しようとしたら、 改行が現れた時点までを1行としてしまうので、 少し違った1行の取得となってしまいました。 どうすればPHPで実現できるのか教えて欲しいです。 【例】 this is a pen. good-bye. ↓ this is a pen.good-bye. を1行分として取得したい。 # PHP 5.3.9 # CentOS 5.8 ---- $inputpath = '/home/test/test.txt'; $file = fopen($inputpath,"r") or die("open error $inputpath"); flock($file,LOCK_SH); while (!feof($file)){ $string = fgets($file,10000); print "$string"; print "\n"; } //relese the lock flock($file, LOCK_UN); //close the file fclose($file); ----

    • ベストアンサー
    • PHP
  • fgets, sscanf, バッファ、ストリーム について

    ファイルからデータを入力するのに、fscanf の代わりに fgets と sscanf を用いようと考えています。 そこで、sscanf に与えるバッファ文字列を、ファイルストリームのように扱う方法は無いものでしょうか。 例えば以下のデータファイルに対して、以下のプログラムをうまく動作させるには、どのようにすればよいでしょうか。 どうぞ、よろしくお願いします。 (データファイル test.dat) n_data 4 1 3 8 4 (プログラム) #include <stdio.h> main() { int i, n_data, *data; char buf[100]; FILE *fp; fp = fopen ( "test.dat", "r" ); fgets(buf, 100, fp); sscanf( buf, "n_data %d\n", &n_data ); data = (int *)malloc( n_data * sizeof(int) ); for( i=0; i<n_data; i++ ){ fgets(buf, 100, fp); sscanf( buf, "%d", &(data[i]) ); } sscanf( buf, "\n" ); close( fp ); printf( "n_data %d\n", n_data ); for( i=0; i<n_data; i++ ) printf( " %d", data[i] ); printf( "\n" ); } ちなみに、2行の fgets(buf, 100, fp); をコメントアウトして、 "sscanf( buf," を "fscanf( fp," に変更するとうまく動作します。