- ベストアンサー
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]; 空の行を読まないようにする方法をご教示いただけませんか。よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>最終行の後に追加されていました。 もしかしたら、最終行を読んだ時点ではEOFにならないのかもしれませんね。その次のfgets()でEOFになるのかな? そうだとすると、読み込んだ行データがブランクの場合にcontinueかbreakすればよさそうです。 while(!(feof($fp))){ $buf=fgets($fp,100); if($buf=="") { continue; }
その他の回答 (5)
ひさしぶりに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回目の判定なんですね。
お礼
ありがとうございました。今回は、gimmickさんに教えていただいた方法で解決しました。ファイルポインタという概念があるのを教えていただき今後の参考になります。 今回のwindowsからのデータはVBで作成したアプリからのものでして、混乱させて申し訳ありませんでした。 VBでのデータは["]をnameの前後につけていますがこれが邪魔になり、手作業で["]のないデータを使用すると邪魔になりませんがこの件は別件で質問させていただきます。 今後もよろしくお願いいたします。
急にVBの話が出てきて混乱しております。PHPの話ですよね。 テストデータを作るだけなので手作業でいいんじゃないですか? それともVBの話するひつようあるのかしら???
補足
混乱させてすみません。windowsで作成したファイルはVBのアプリから作成していました。テストデータを手作業で作成してみると空のデータがでませんでした。 VBは別の話でしたね。ありがとうございます。
この質問ではよくわからないことがあります。改行が追加されるのは最終行のあとなのでしょうか。それとも各行の間に追加されるのでしょうか。サンプルが1行なのでどちらか判断できないです。 元のデータを複数行にして確認してください。この場合は次のどちらになるでしょう。 1. 最終行の後に行が追加される 2. 各行で行が追加される まあ、改行コードの問題だと思いますが。
補足
早速のご回答ありがとうございます。 最終行の後に追加されていました。よろしくお願いします。
- gimmick
- ベストアンサー率49% (134/270)
ファイルの改行コードが\r\nになっているせいだと思います。 サーバでfgets()した時に\rと\nが1つの改行コードとして認識されているのでしょう。 対処方法としては (1)可能であればテキストモードでオープンする (2)ファイルの改行コードを\nにしておく といった事が考えられます。 #PHPを知らないので間違っているかもしれません。
補足
早速のご回答ありがとうございます。 オープンするときにテキストモードにするために下記のようにしてみましたが変化はありませんでした。 $fp=fopen($fileName,"r");⇒$fp=fopen($fileName,"rt") また改行コードを\nにしてみましたが変化はありませんでした。もう少し調べてみます。
- gatyan
- ベストアンサー率41% (160/385)
111のあとに改行を入れていると思いますが、改行を入れないとどうなるか試してみました?
お礼
空行を検出することで解決いたしました。ありがとうございました。今後もよろしくお願いいたします。
補足
早速のご回答ありがとうございます。 VBで作成したアプリから下記のように書き込んでいまして、改行を意識していないのですが。 Open FileName For Append As #intFileNo Write #intFileNo, Name, password Close #intFileNo vbで改行コードを入れたり、外したりできるのでしょうか。
お礼
解決いたしました。大変助かりました。ありがとうございます。今後もよろしくお願いいたします。
補足
ありがとうございます。 この方法で試してみます。結果は後で報告させていただきます。