fwriteでファイル書き込みに問題が発生しています

このQ&Aのポイント
  • ファイルの書き込みを行う際、fwrite関数を使用していますが、何らかの問題が発生しています。
  • 具体的には、ファイルポインタの位置を設定するためにfseek関数を使用していますが、期待通りの位置にポインタが設定されません。
  • また、書き込みの際にも予期しない結果が生じており、正しくファイルの末尾に書き込むことができません。
回答を見る
  • ベストアンサー

fwriteで書き込み

やりたいことは・・・下に書いていきます。 何がおかしいのか教えてください。 $fp = fopen("example.txt", "r+"); fopenでexample.txtを読み書き可能で開きます。 返り値はポインタですよね。 $fseek = fseek($fp, -3, SEEK_END); $fpで開いたexample.txtのポインタを、ファイルの最後尾から3バイト戻したつもりです。 返り値は 0 成功 -1 失敗 $ftell = ftell($fp); で、今のポインタの位置を確認します。 返り値はポインタ。 fwrite($ftell,$write); $writeの内容を、example.txtの最後から3バイト戻ったところへ書き込み・・・のつもりなのですが。 専門分野ではありませんので、調べてもなかなか進まないです。 ご教授お願いします。

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

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

  • ベストアンサー
  • syuuiwsd
  • ベストアンサー率56% (17/30)
回答No.1

ftellの返り値はポインタではなく、int値またはfalseですよ。 fseekの時点で、ファイルポインタはすでに最後から3バイト戻ったところへさしましたよ。ですので、ftellをしなくて構いません。 fseek( $fp, -3, SEEK_END ); fwrite( $fp, $write ); で結構だと思います

関連するQ&A

  • fwrite の文法が間違っていますか?

    どうしてもエラーになってしまいます どこが間違っているかお教え頂けませんでしょうか 宜しくお願い致します $fp_i = fopen($indexphp, "w"); fwrite($fp_i, "<html>\n<head>\n"); fwrite($fp_i, "<title>title</title>\n"); fwrite($fp_i, "<meta http-equiv=\"content-type\" content=\"text/html; charset=Shift_JIS\">\n"); fwrite($fp_i, "</head>\n"); fwrite($fp_i, "<body>\n"); fwrite($fp_i, "<?php\n"); fwrite($fp_i, "$txt = 'test'\n"); fwrite($fp_i, "print'($txt)';\n"); fwrite($fp_i, "?>\n"); fwrite($fp_i, "</body>\n"); fwrite($fp_i, "</html>");

    • ベストアンサー
    • PHP
  • fwriteについて

    #include<stdio.h> int main(void) { FILE* fp; double f[5]={ 3.1, 2.9, 4.2, 3.7, 4.0}; double data; fp=fopen("test.txt","wb"); if(fp==NULL) { printf("text.txtが開けません。"); return 0; } fwrite(f,sizeof(double),5,fp); fclose(fp); }と入力したのでが、test.txtファイルを見ると 文字化けがでて、数値がわかりません。 数値もテキストファイルに出力する方法があったらご教授よろしくお願いします。できたらなぜこのようなことが起きたのか教えてくださるとうれしいです。

  • fseekの使い方

    C言語で、 #include "stdafx.h" #include <stdio.h> void main(void) { FILE *fp; fp = fopen("text.txt", "a+"); fseek(fp, 0L, SEEK_SET); fputs("0\n12345",fp); fseek(fp, 0L, SEEK_SET); fputs("6\n789",fp); fclose(fp); } と書き、text.txtに abcde と書いてあるとします。 私の目論見では、a+で開いている為ファイルの最後から書き始めるとしても、 fseekで最初に戻るので、実行すればtext.txtの中身は 6 78945 になると考えていたのですが、 結果は abcde0 123456 789 となりました。 fseekをいじって-3Lとかにしてみたのですが、fseekによって書き込む位置が動いている様子がありません。 fseekの使い方が間違っているのでしょうか? ちなみに環境はWindowsXPで、Visual C++ 2008で行っています。

  • ランダムアクセスができない

    C言語のランダムアクセス(fseek)で、 アクセス位置を「ファイル末尾」に設定したいのですが どうも自分で作成したソースは正常に動いてくれません。 (常にアクセス位置が先頭になってしまいます) 何かが間違ってるのは確かなのですが、 もし原因がお判りの方がいらっしゃいましたら アドバイスをお願いします。 動作としては、追記書き込みみたいな感じで どんどん同一ファイルに書きこんで行く感じです ―――――――――――――――――――――――――― #include <stdio.h> #include <string.h> // 書き込み関数 bool Write( char *fname, char *str ){ FILE *fp = NULL; int len = (int)strlen(str); fp = fopen( fname, "wb" ); if( !fp ) return false; fseek( fp, 0L, SEEK_END ); printf( "位置:%d\n", ftell(fp) ); fwrite( &str, len, 1, fp ); fclose( fp ); return true; } // メイン関数 int main(){ char *fname = "Test.txt"; Write( fname, "テスト" ); Write( fname, "教えて" ); Write( fname, "goo" ); return 0; } ―――――――――――――――――――――――――― 動作結果:   Test.txtの中身「goo」 動作してほしい結果:   Test.txtの中身「テスト教えてgoo」 (※中身はバイナリ形式です)

  • ファイルの大きさを調べたいのですが、、、(C言語)

    2週間前にC言語の勉強を始めたばかりです。 「あるファイルのサイズを見て、メモリを確保し、  読み出した内容をソートして、同じファイルに再び書き出す」 というプログラムを作ろうとしているのですが、 「ファイルのサイズを調べる」という時点でつまづいてしまっています。。。 適当に英数字を書き連ねたファイル(aaa.txt)を、 (fp = fopen(filename,"a+") という形で開いています。 追加読み書きするので"a+"かな? と思ったのですが、、、   //ファイルの終端に移動し、その位置を取得する   fseek(fp1, 0L, SEEK_END);   position = ftell(fp1);   printf("ファイルポインタの位置は %ld です",position); ファイルの大きさを調べるのに、この方法を試してみたのですが、 位置の値が0になってしまいます。。。 filelength(fileno(fp)); でも試してみましたが、 やっぱりファイルサイズが0と返ってきます。 何が原因なのか、何が悪いのかも判らなくて途方に暮れています。 「ここはこう書くんだよ」と、的確なご回答を戴けると幸いです。 基本的な質問で申し訳ありませんが,宜しくお願い致します。

  • 無料ホームページの鯖でPHPでfwrite出来ない

    無料ホームページのサーバに"php"というフォルダをアップし、その中に"write.php", "text.txt","read.php"というファイルを作って実行させたのですが、 "write.php"で、 $file = "text.txt"; $fp = fopen($file, "w"); if ($fp == FALSE) { print "ファイルオープン失敗<br />"; } else { fwrite($fp, $text); fclose($fp); } を実行しても"text.txt"の内容が変わらない(空のまま)のですが、何がいけないのでしょうか? "text.php"のパーミッションは666で、"php"フォルダは707です。 考えられる原因をご教授下さい、お願いします。

    • 締切済み
    • PHP
  • VisualC++でのバイナリファイル

    VisualC++でのバイナリファイルのサイズの取得。 Win7 x64 VC++2012 調べた所によると、 バイナリモードではNULL文字を使用できるため、 FILE* fp; fopen_s(&fp,"data.bin","rb"); fseek(fp,0,SEEK_END); size_t fsize=ftell(fp_cl); //fseek(fp,0L,SEEK_SET);//元の位置に戻す。 fclose( fp ); のような感じでサイズを取得してはいけない。 (fseekのSEEK_END動作が不定のため) ……と思っていたのですが、他に方法と言えば、 ファイルを一度全て空読みするくらいしかないので、 試にやってみたところ、上手く行ってしまいます。 一応NULLの入ったバイナリでも正しく取得できてしまいました。 これはCの仕様が変わったためなのか、VC++がたまたま対応しているのか、 どちらでしょうか? また、他に上手い方法があればよろしくお願いいたします。

  • ファイル末尾10バイトを削る

    ファイルを開き、末尾10バイトを削り、上書きする というプログラムを作成しています。 とりあえず、以下のようなソースが出来ました。 ------------------------------------------------------------------ ifp = fopen( "openfile.dat", "rb"); ofp = fopen( "outfile.dat", "wb" ); fseek( ifp, -10, SEEK_END ); pos_end = ftell( ifp ); fseek( ifp, 0, SEEK_SET ); for( pos_now = ftell( ifp ) ; pos_now < pos_end; pos_now = ftell( ifp )){    rCnt = fread( pbuf, sizeof( char ), 1, ifp );    f( rCnt == EOF ) break;    fwrite( pbuf, sizeof( char ), 1, ofp ); } fclose( ifp ); *(openfile削除) *(リネーム処理:outfile.dat -> openfile.dat) 以下略 ------------------------------------------------------------------ ソースにあるとおり、 ファイルを開く -> ファイルの末尾10バイト目を記憶する。 -> アウトファイルを開く -> 記憶した位置までコピーする -> オープンファイルの削除 -> リネーム処理 という順番で処理を行っています。 本来は、 ファイルを開く -> ファイルの末尾10バイト目にEOFをいれる -> ファイルを閉じる みたいな感じでやるつもりだったのですが、うまくいきませんでした。 後者のやり方や「私ならこうする!」等アドバイスがありましたら、是非お聞かせください。 よろしくお願いします。

  • ファイルサイズの取得について

    2つのテキストファイルのサイズを取得し、そのファイルサイズ分だけを動的にメモリを確保しようとしています。 int *c,*a;と宣言し、 fp=fopen("./data/Problem.txt","r");//1つ目のファイル fseek(fp, 0, SEEK_END); /* ファイルの終端までシーク */ size = ftell(fp); /* 終端の位置、すなわちファイルサイズを得る */ fseek(fp, 0, SEEK_SET); /* ファイルの先頭に戻る */ c = (int *)malloc(size); /* ファイルサイズ分メモリ確保 */ while((x=fgetc(fp))!=EOF){ c[i]=x; i++; } c[i]='\0'; i=0; fclose(fp); fpa=fopen("./data/Answer.txt","r");//2つ目のファイル fseek(fpa, 0, SEEK_END); size = ftell(fpa); fseek(fpa, 0, SEEK_SET); a = (int *)malloc(size); while((x=fgetc(fpa))!=EOF){ a[n]=x; n++; } a[n]='\0';//・・・・(1) n=0; fclose(fpa); とすると1つ目のファイルの方だけはうまくいくのですが、(1)の部分で 「sample.exeの0x00411dcでハンドルされていない例外が発生しました:0xc0000005:場所0x0000000に書き込み中にアクセス違反が発生しました。。」 というエラーが出ます。 また、 int *c,*a;を int *c,a[300]; のように片方を配列として宣言し、 //a = (int *)malloc(size); /* ファイルサイズ分メモリ確保 */ のようにコメントアウトすると上記のエラーは出ずにcにメモリは確保されているようです。 これは何故なのでしょうか? また、どうすればaとcでメモリを確保出来るようになるのでしょうか? よろしくお願いいたします。

  • テキストファイルの読み込みとファイルポインタについて質問です。

    テキストファイルの読み込みとファイルポインタについて質問です。 最近PHPを勉強し始めました。 fgets()とfseek()についてわからないことがあるので教えて頂けないでしょうか。 現状以下のテキストとPHPファイルを用意しています。 PHPに2行目のbを表示させたいのですが、思ったように表示をさせることができません。 fgets()は"現在のファイルポインタから次の1行を取得" fseek()は"ファイルポインタを指定したバイト数分移動する"と調べてわかりました。 この二つを使って2行目を指定してbを表示したいのですがうまく表示されて困っています。 test.phpのコメントの★の部分がわからない箇所になります。 おそらく根本的な考え方が間違っていると思うのですが…いろいろ調べたのですがわかりませんでした。 申し訳ありませんがご教授願えないでしょうか。 ----------------- new.txt ----------------- a b c d e ----------------- ----------------- test.php ----------------- <?PHP $new_file = 'new.txt'; $fpt = fopen($new_file,'r'); // ファイルオープン直後のポインタ位置 echo '現在の位置=行指定'.ftell($fpt).'<br>'; print fgets($fpt).'<br>'; // ポインタを5進める fseek($fpt,5); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポインタの位置確認 print fgets($fpt).'<br>'; // ★ここでeを表示したい // 現在の位置からポインタを3戻す fseek($fpt,-3,SEEK_CUR); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★行指定が5-3なので2に…ならないです。 print fgets($fpt).'<br>'; // ポインタを先頭へ rewind($fpt); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポイントが先頭にきたか確認 print fgets($fpt).'<br>'; // ポインタを最後へ fseek($fpt,0,SEEK_END); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★new.txtはabcdeの5行なので5になると思いきや18に… print fgets($fpt).'<br>'; fclose($fpt); // ファイルを閉じる ?> ----------------- ----------------- 実行結果 ----------------- 現在の位置=行指定0 a 現在の位置=行指定5 現在の位置=行指定3 b 現在の位置=行指定0 a 現在の位置=行指定18

    • ベストアンサー
    • PHP

専門家に質問してみよう