• ベストアンサー

ファイルの内容の削除【ファイルシステム関数】

以下のユーザー定義関数で、POSTで受け取った数値の増減をあるファイルに書き換える作業をおこないたいのですが、1桁の数値であれば問題ないのですが、2桁の数値にし、マイナスの数値で減らすと値が「00」となってしまいます。文字列として認識してしまっているためかとは存じますが、良い解決方法が思い浮かびません。以下ソースです。 <? function cnt($str){ if(isset($_POST[$str])){ $fp = fopen( $str.".txt", "r+" ); flock($fp,2); $count = fgets( $fp, 5 ); $strstr = $_POST["$str"]; $count+= $strstr; rewind( $fp ); fputs( $fp, $count ); flock($fp,3); fclose( $fp ); print($count); }else{ $fp = fopen( $str.".txt", "r" ); $count = fgets( $fp, 5 ); print($count); };} ?> ファイルシステム関数については苦手で、うまく理解しきれていません。 アイデア・解決法をご存知の方がいらっしゃいましたら、ご回答いただければうれしいです。よろしくお願いいたします。

  • PHP
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • umota
  • ベストアンサー率46% (150/324)
回答No.2

元のサイズより小さいサイズを書き込んでも後のデータは残ったままです。 ヒント fputs( $fp, "$count\n" );

puzzleman
質問者

お礼

ご回答ありがとうございます!ヒントの通りで改善いたしました!! ただなぜ改行で改善したのかが理解仕切れて下りません^^; ファイルシステム関数理解のためにも、よろしければお教え願えればと存じます。<(_ _)> よろしくお願いいたします。

その他の回答 (2)

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.3

PHPでの、暗黙の文字列から数値への方変換では、文字列の最初から見ていって、数値として理解できるところまでを数値に変換します。 改行が入れば、そこまでを数値として見ますので、その後に何が入っていようと、そこまでしか見ません。

puzzleman
質問者

お礼

ご回答ありがとうございます! 理解できました!!とても勉強になりました!! ご回答いただきました皆様、ありがとうございました。 心より感謝いたします。

  • masa6272
  • ベストアンサー率66% (93/140)
回答No.1

+r でオープンして、rewindで巻き戻して書いてますね。 ひょっとして、書き直す前のファイルは、 X0 --- Xは何かの数字 20 とか 40 とか 書き出した値は 0 ではないですか? fputsの第2引数は書き出す最大バイト数です。 書き出す数値が1文字で収まれば、最初の1文字だけが書き換えられます。

puzzleman
質問者

お礼

ご回答ありがとうございます。数字はおっしゃられる通りです。 ファイルシステム関数がなかなか理解しきれておりませんでした・・・ fputsの機能としては理解できました。ありがとうございます。

関連するQ&A

  • カウンターを一定数でリセットしたい

    はじめまして。 レッツPHPのカウンタを使っています。 <?php $fp = fopen("count.txt","r+") or die("Error!"); $count = fgets($fp, 64); $count++; rewind($fp); //set_file_buffer($fp, 0); flock($fp, LOCK_EX); fputs($fp, $count); fclose($fp); echo $count; ?> count_file.txt にはA00と記入しているのでA99になったら次はB00~Z99までカウントされるのを、F99まできたらリセットしA00から始めたいのですが式が分りません。$count++;を書き換えればいいのだとは思いますが・・・ よろしくお願いいたします。 PHP4.3.3

    • ベストアンサー
    • PHP
  • file関数とファイルポインタ

    ファイルの内容を(書き換えるために一旦)読み込む時に、 fgets関数と違ってfile関数は fopen関数を使わなくても済む、ということで 便利なので使ってみようと思っているのですが、 ちょっと躓いています。 set_file_bufferやflock、rewindが必要なのですが、 これらはどれも引数にファイルポインタを使います。 fopen関数を使っていないのでコレがないのですが、 どうすればいいのでしょうか? fopenのあとにfileを使う? fopenを使わなくても閉じる時にはfcloseが必要? でもfcloseもファイルポインタを使うし… よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPのアクセスカウンターのバグについてです!

    PHPを勉強しているものですが アクセスカウンターをネットで調べ自分なりに書いたのですが 日にちが変わるとトータル、今日、昨日が全く動かなくなります。 どこをどうすればいいのか教えていただけないでしょうか? お願いします。 $txt='counter.txt'; $fp=fopen($txt,'r+'); if($fp!==false){ if(flock($fp,LOCK_EX)){ $counter=fgets($fp);//トータル 今日 昨日 日付 $count=explode(' ',$counter); if(date('j') != $count[3]){ $count[3]=date('j'); $count[2]=$count[1]; $count[1]=0; } $count[0]++; $count[1]++; $counter=implode(' ',$count); rewind($fp); fputs($fp,$counter); flock($fp,LOCK_UN);} } fclose($fp); ちなみにバグはトータル→今日→昨日→日付の順です。 500 1 1 262625 のようになっていました。 よろしくです。

    • ベストアンサー
    • 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
  • ファイルを開いたままオープンモードを変更したい

    $fp = fopen ($file, "r"); flock ($fp, 2); で開いたファイルをロックを解除しないままファイルを空にして書き込みモードに移行する方法を教えてください。 或いは $fp = fopen ($file, "r+"); flock ($fp, 2); からfputs()で書き込んだ後にファイルのファイルポインタ以降の部分を切り捨てる形でも良いです。 flock ($fp, 2);の後にfgetsによりファイル内容を取得した後ファイルロックをしたままファイルの余計な部分を捨てたいので $fp = fopen ($file, "w"); flock ($fp, 2); や $fp = fopen ($file, "r"); flock ($fp, 2); fgets ($fp); flock ($fp, 3); fclose ($fp); $fp = fopen ($file, "w"); flock ($fp, 2); は必要ありません。

    • ベストアンサー
    • PHP
  • PHPの演算からファイルに書き込みまで

    PHP初心者のものです。すみません、自分でもしらべたのですが、どうしても解決できなかったので質問させてください。単純にボタンを押すごとにテクストにある数字を減数させていく簡単なプログラムを作りたいんですけど、 どうもうまくいきません。 最初に、180とデータに入力して、最初のうちはボタンを押すごとに5づつ減数されているのですが、桁が2桁になるとき(89とか90にまで減数とか)にかならず、980とかの数字に増数してしまいます。桁数が変わる直後でどうも変な感じになってしまいます。どちらさまかわかるかたいらしゃったら、時間の空いているときにでもお教えください。 OS:XP PHP:5.0 サーバ:apache PHPのコードは下のようになっていて、count.txtを、データファイルとして使ってます。 <html> <head> <title>減数</title> <body> <h2>うにゅ</h2> <!-- 【フォームよりデータ送信】 --> <form name="form" action="./A.php" method="POST"> <input type="submit" value="縮小"> </form> <p>現在の数は </p> <b> <?php $CountFilePath = "./count.txt"; $fp = fopen($CountFilePath , "r+"); $count = fgets($fp,5); rewind($fp); fputs($fp,$count-5); fclose($fp); print $count; ?> </b>です。 <p><hr></p> </body> </html>

    • ベストアンサー
    • PHP
  • phpである処理をすると数を1足して、ある処理をするとその数字から1引

    phpである処理をすると数を1足して、ある処理をするとその数字から1引くような事をしたいのですが、上手くいきません。(まれに数字にずれが生じてしまいます。) 1足していくもの $fp = fopen("./data/registry/buy.dat","r+"); $registry_count = fgets($fp,1024); if($registry_count == ""){ $registry_count = 0; } $registry_count++; flock($fp,LOCK_EX); fseek($fp,0); fputs($fp,$registry_count); flock($fp,LOCK_UN); fclose($fp); 1引いていくもの $fp = fopen("./data/registry/buy.dat","r+"); $registry_count = fgets($fp,1024); if($registry_count != "0"){ $registry_count--; } flock($fp,LOCK_EX); fseek($fp,0); ftruncate($fp,0); fputs($fp,$registry_count); flock($fp,LOCK_UN); fclose($fp); どなたかご教授ください。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • a.phpにあるアクセスカウンターの数値を取得する

    質問を出すのは初めてでプログラム1年生です。 質問内容は a.phpにあるアクセスカウンターの数値をb.phpに呼び出したいのですが、可能なのでしょうか?? ちなみにb.phpではアクセスカウントを増やしたくありません。 <form>で括り$_GETで呼び出すなどしましたが、1度a.phpから飛ばないと表示されませんでした。 いろいろ類似する質問や記事を見て試行錯誤しましたが、どうしても表示されません。 どなたか教えていただけたら幸いです。 a.phpで記載している内容です。 <?php $counter_file = 'counter.txt'; $counter_lenght = 8; $fp = fopen($counter_file, 'r+'); if ($fp){ if (flock($fp, LOCK_EX)){ $counter = fgets($fp, $counter_lenght); $counter++; rewind($fp); if (fwrite($fp, $counter) === FALSE){ print('ファイル書き込みに失敗しました'); } flock($fp, LOCK_UN); } } fclose($fp); print('COUNT:'.$counter); ?> b.phpで記載している内容です。 <?php ob_start(); include("a.php"); ob_clean(); print $counter; ?> 私の取って付けたような知識では太刀打ちできませんでした。 どうかお助け願います。

    • ベストアンサー
    • PHP
  • アクセスカウンターが更新されない(PHP)

    サーバーに count.txt というファイルを置いて 下記のようなPHPで更新するものを作りました。 <? $fp = @fopen("count.txt","r+") or die("ファイルが開けません");//読み書きモードでオープン flock($fp, LOCK_EX); $count = fgets($fp, 64); //64バイトorEOFまで取得、カウントアップ $count++; rewind($fp); //ポインタを先頭に、ロックして書き込み fputs($fp, $count); fclose($fp); //ファイルを閉じる echo $count; //カウンタ表示 ?> しかしながらカウンターは更新されません count.txt、の属性は666としてあります。 FTPを実行して 左右の窓の右側がサーバ側なので その中の、count.txt、を実行すると メモ帳で実行(ダブルクイック)し なかに書かれている数字を(たとえば100とあったものを101と書き換える)変更し 終了すると count.txtは更新されています、保存しますか と聞いてくるので、はい(Yes)で答えて、閉じ また開くと、100のままなのですが なにが原因か推定できないでしょうか? そのディレクトリー自体(ublic_htmlですが)の属性も書き込み可としても ダメでした。

    • 締切済み
    • PHP
  • fscanf()

    fcanf()がうまくいきません。 画面には、42640888のような数値が表示されます。 どこが間違ってるか教えてください。 (test.txtに23と書いてあるとします。) #include<stdio.h> int main(void) {    FILE *fp;    FILE *fp1;    char str[10];    int a;    fp=fopen("test.txt","r")    fp1=fopen("a.txt","w")    while(!feof(fp)){       fgets(str,8,fp);       fputs(str,fp1);    }    fscanf(fp,"%d",&a);    printf("%d",a);   fclose(fp);   fclose(fp1);   return 0; }