• ベストアンサー

fopen

あるファイルを$fp = fopen("./filename","r+");で開き、ファイルの文頭の18バイトを削除して保存するにはどうしたらよろしいでしょうか?

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

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

概ねこんな感じ、 バイナリファイルなら"b"が必要なことがあるとか、ファイルのロックは必要ないとかそういうのは、細部調整 ---------------------------------------------------------------- <?PHP $fp = fopen("./data.txt","r+"); if (flock($fp, LOCK_EX)) { // 排他的ロックを行う fread($fp, 18); //18バイト読み飛ばす $data=stream_get_contents ($fp);//PHP5 ftruncate ($fp, 0);//中味の削除 rewind($fp); //ポインタのリセット(巻き戻し) fwrite($fp, $data); flock($fp, LOCK_UN); // ロックを解放する } else { echo "Couldn't lock the file !"; } fclose($fp); ?>

wf3255
質問者

お礼

お礼が遅れてしまって申し訳ございません。 無事解決できました。ありがとうございます。

関連するQ&A

  • fopen関数について

    ----------------------------------------- #include<stdio.h> #include<stdlib.h> int main() { FILE *fp; char filename[80],ss[256]; printf("ファイル名="); gets(filename); if((fp=fopen(filename,"r"))==NULL){ printf("ファイルをオープンできません.\n"); exit(1); } while(fgets(ss,256,fp)!=NULL){ printf("%s",ss); } puts(""); fclose(fp); return 0; } ----------------------------------------- 初心者な内容の質問ですいません。 以上のプログラムでまず、「gets(filename);」により、「filename[80]」の配列に「aaa.txt」という文字列を格納し、そのファイルをfopenで読もう込もうとしています。 そこで、 if((fp=fopen(filename,"r"))==NULL) の部分に疑問があるのですが、「filename」という配列名だけで中身の「aaa.txt」と何故認識できるのでしょうか? 配列名ということで、先頭アドレスのみの情報しかないと思いました。 教えていただければ嬉しいです。

  • C言語 fopen

    初心者の質問になります。現在ファイルがオープンできるかどうかを確認したいのですが、指定したディレクトリの中のファイルを指定しているのですが、オープンできませんという結果が返ってきます。同じ場所にファイルを置いてファイル名だけでしていするとオープンが出来ます。 何卒よろしくおねがいします。 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { FILE *fp; char *filename = "/file/d20151001.csv"; fp = fopen(filename,"r"); if (fp == NULL) { printf("\aファイルをオープンできません\n"); } else { printf("ファイルがオープンできました\n"); fclose(fp); } return (0); } ディレクトリ(わかりにくくてすいません汗) file------d20151001.csv data.c 環境 VisualStudio

  • stream_get_contentsの代替関数

    あるファイルの文頭18バイトを削除し、その後の部分を保存するスクリプトを考えています。 ======== 例) $fp = fopen("aaa.send","r+"); fread($fp, 18); //18バイト読み飛ばす $data=stream_get_contents ($fp);//PHP5 ftruncate ($fp, 0);//中味の削除 rewind($fp); //ポインタのリセット(巻き戻し) fwrite($fp, $data); ======== しかしながらサーバー環境のPHPが4.3.8のためstream_get_contents関数が使えません。 同じような意味を持つ関数をご存知の方がいらっしゃいましたらご教授願います。

    • ベストアンサー
    • PHP
  • fopenが動作しない

    PHPで、別のファイルで取得したファイル名をもとに fopenを使ってファイルを開こうとしているのですが、 どうしてもうまくいきません。 具体的な症状は以下のとおりです。 a.phpの中で、 … $file[2] = "hoge02.xml"; … のように、配列にファイル名を代入します。 これを b.php で require_once('a.php'); とした後 print_r($file); とすると Array([0] => … [2] => "hoge02.xml" [3]…) のように表示されるところまでは確認できました。 しかし、 $file0 = $file[2]; $fp = fopen("$file0", 'r'); とすると Warning: fopen( "hoge02.xml" ) [function.fopen]: failed to open stream: Invalid argument in [b.php の絶対アドレス] とエラーが出てしまい、実行することが出来ません。 そこで、 //$file0 = $file[2]; $file0 = "hoge02.xml"; $fp = fopen("$file0",'r'); とすると実行することが出来ました。 作成しているシステム上、fopenの1つ目の引数には変数または配列を使いたいのですが、 エラーが発生してどうしてもうまくいきません。 自分なりにも似たようなエラーがないか調べたのですが、 それらしいものを見つけることが出来ず、お手上げ状態です。 どなたか解決策をご存じないでしょうか。 ご教授の程、よろしくお願い致します。

    • 締切済み
    • PHP
  • fopenについて

    ご質問させて頂きます。 ファイルの中身は以下の通りです。 TX55123455846521113456211415122335122200452125442[EOF] という感じの 一行だけの細長いデータです。 このファイルのデータを 読み取ろうとして 以下の様にしました。 int main(void){ char buf[5]; FILE *fp; fp = fopen("ex.fil","r"); if (fp == NULL){ printf("can't open"); exit(1); } エラーは出ないのですが データがないと判断されてしまうようで 「can't open」 となってしまいます。 どういう点がおかしいのか お気づきな点がありましたら ご教示して頂けたら幸いです。

  • fopen関数

    いまいちfopen関数の使い方がわかりません。 FILE *fp; fp = fopen("test.txt","W"); fcose(fp); ですが、なぜここでポインタが出てくるんでしょうか? メモリ上に領域fpを作って、そこに関数のアドレスを格納している? と一応解釈していますがあっていますか?

  • fopenでファイル名に、変数を使いたい

    カレントディレクトリにある「1.txt」を扱う場合は fp = fopen("./1.txt", "r"); 上記で出来るのですが、扱いたいファイルが複数あり、 「./x.txt」 として、「x」の値を変えながら複数のファイルを取り扱いと考えております。 char namae[2]={'1','2'}; for(x=0;x<2;x++) fp = fopen("./%c.txt",name[x], "r"); とやってみたのですが、 「fopenの呼び出しに余分なパラメータがある」と出てしまいます。 どのようにしたら、よろしいでしょうか?

  • FILE型からポインタ情報をもらうことはできますか?

    FILE fp; fp = fopen(filename, "r"); これでfpにfilenameのポインタが入ると思っているのですが、 filenameを何度かリードした後、fpからリードポインタの値を 取り出して、 int *Infile; に、代入したいのですがこれって出来ますか?

  • fopenの追記モードについて

    宜しくお願いします。 fopenで追記モードでファイルを追記するとき、 FILE *fp; fp = fopen("hogehoge.txt", "a"); fprintf(fp, "aaa\n"); fclose(fp); fopen("hogehoge.txt", "a"); fprintf(fp, "bbb\n"); fclose(fp); と毎回ファイルを開きなおすと、出力結果が bbb aaa となってしまうのですが、 aaa bbb と出来ない物でしょうか?

  • fwrite~サーバ環境で、なぜか0バイト

    ちょっと悩んでしまい質問させていただきます。 下記スクリプトにて、 (1)./aaaディレクトリ内の最新更新日付ファイルをオープン (2)文頭18バイトを削除し、残りのデータを同じファイルに保存する。 というスクリプトを作成しました。 っがしかし、ローカル環境(XAMPP)では上手く動いたのですがサーバー上ではなぜか当該ファイルが0バイトになってしまします。解決策がわかりませんのでご教授願います。 ただ、一点気がかりなのがサーバーは仕様でPHP4.3.2であるので、マニュアルのftruncateにある“注意”の内容が気にかかっています。戻り値が異なることが関係有るかも含めてご教授いただけると助かります。 ======== <?php $dir = opendir("./aaa"); $latestfile = 0; while ($fnm = readdir($dir)) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./aaa/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename =$fnm; $filename = "./aaa/$latestfilename"; } } $fp = fopen($filename, "rwb+"); fread($fp, 18); //18バイト読み飛ばす ftruncate($fp, 0);//上記18バイトを削除 $warn = ''; while (!feof($fp)) { $warn .= fread($fp, 8192); } rewind($fp); fwrite($fp, $warn); fclose($fp); closedir($dir); ?> ========

    • ベストアンサー
    • PHP

専門家に質問してみよう