• 締切済み

fopenのモードによりfgetsするレングスが異なるのは何故ですか?

ファイルを読み、そのレングスをチェックしています。 $file = @fopen($_FILES['fl']['tmp_name'],"r"); if ($file) {  while (!feof($file)) {   $rec = fgets($file);   print("レングス".strlen($rec)."<br>");   (後略) 例えば1500バイトの固定長ファイルを読んだ場合、 fopenモード"r"だと以下の通りです。  レングス1502(改行が含まれるので1500+2?)  レングス1502 これをモード"r+"にすると以下のようになります。    レングス1502  レングス1499 両者の差はどこから来ているのでしょうか? ご教示いただけると幸いです。

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

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

私の環境では再現しませんね。 単純に短いのですから、中身を確認してみては?

mogmogtae
質問者

お礼

ご回答ありがとうございます。 よくよく調べたところ、モード"r+"の時に、 プログラム内でファイルの内容を破壊するような 処理がありました。 故に、レングスが変わってしまっていたようです。

関連するQ&A

  • fgetsの使い方について

    こんばんわ。phpでラジオボタンを使用して投票フォームを作っています。 投票した値をログファイルに書き込んで4項目をカウントできるように格納したいのですが、エラーも出ずにスルーして原因がわからず困っています。 イメージでは ログファイル↓ 24 もちろん 11 するかも 5  わからない 12 ない 問題のソースは以下の通りです。 $write = "$radiobutton"."\n"; $fp = fopen("../php/test1.txt","a+"); $line1=fgets($fp); $line2=fgets($fp); $line3=fgets($fp); $line4=fgets($fp); fputs($fp,$write); fclose($fp); print "fgets1回目=".$line1."<br>\n"; print "fgets2回目=".$line2."<br><br>\n"; print "fgets3回目=".$line3."<br><br><br>\n"; print "fgets4回目=".$line4."<br><br><br><br>\n"; わかる方いましたらご教授お願いします。

    • ベストアンサー
    • PHP
  • PHPのfopenのバイナリモードについて

    PHPのfopen時のバイナリモードについて質問です。 PHPのマニュアルにはWINDOWSのようなバイナリとテキストモードの形式の違う システムでは、画像等のバイナリファイルを扱うときはbを付けてバイナリモードで扱うことが推奨されていますが、 WINDOWS環境でためしたところ、画像ファイルをバイナリではなくテキストモードで開いて中身のデータを読み込んで、別名でfopen("~.jpg","w")で書き込んでも、きちんと表示される画像が作成されました。 テキストモードでバイナリファイルを開いても読み込めってさらに、新規でかきこめるなら なぜ二つのモードが存在するのでしょうか? ちなみに、WINDOWSにおけるバイナリとテキストモードの違いって改行文字が ¥nか¥r¥nの違いだけでしょうか? リナックスではバイナリもテキストも中身の改行文字は¥nとなるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • fgetsの処理を詳しく説明してください、お願いします。

    char line[100]; (stream = fopen( "test.c", "r" )) == NULL; while( ( fgets( line, 100, stream ) != NULL)){ printf( "%s", line); } fclose( stream ); 上記のコードでファイルが一行ずつ表示されるのですがなんとなくでfgetsを使っていたのでwhile文中のfgetsの動きがよく分かりません。 初めに改行文字までの一行を読み込むのはわかるのですが、何故繰り返すときlineに2行目、3行目、・・・ と取り込むのかがわかりません。 よろしくお願いします。

  • php、fgets関数について質問です。

    質問させてください。 phpのfgets関数についてなのですが、 $filename = fopen("http://ほにゃらら.com", "r"); while (!feof($filename)) { $naiyo = fgets($filename); echo $naiyo; } fclose($file_handle); で、ファイル内容の全体を出力するということらしく、実際に出力できたのですが、ファイルの特定の一部を出力するにはどうすればいいのでしょうか? 例えば、読み込んだページ内容の<span id="ほにゃらら">から</span>の間を出力するなどは可能なのでしょうか? 当方、phpを最近勉強し始めた人間ですが、どなたかご教授下さい!

    • ベストアンサー
    • PHP
  • C言語のfopenについて教えてください。

    C言語のfopenについて教えてください。 ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。 そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか? 何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。 確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか? もし、エラーとなる場合、回避する方法がありますか? また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか? 読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。 よろしくお願いしますm(_ _)m

  • fgets で値が取得できない

    fopen , fgets に関して質問させてください。 現在「readme」というファイルを UTF-8 にて開こうとしております。 fopen でファイルは開けているようなのですが、fgets を呼び出した際に以下の様なメッセージが出て異常終了してしまいます。 『Microsoft Visual Studio C ランタイム ライブラリは Sample.exe に致命的なエラーを検出しました。 [中断] をクリックしてプログラムをデバッグするか、または [続行] をクリックしてプログラムを終了してください。』 UTF-8 を指定しない場合は上手く動いているようです。 UTF-8 の時は特殊な取り出し方をしなければならないのでしょうか? Visual C++ 2008 Express Edhition の デバックモードで動かしています。 ****************************** 1 : FILE *file1; 2 : char s[256]; 3 : 4 : file1 = fopen( "C:\\readme", "r, ccs=UTF-8"); 5 : while (fgets(s, 256, file1) != NULL) 6 : { 7 : printf("%s", s); 8 : } ******************************

  • 改行コードの除去

    phpでcsvファイルを読み込んで処理しています。 $handle = fopen(ファイル名,"r"); while (!feof($handle)){ $filedata = fgets($handle); $record = explode(",", $filedata); というようにやっているのですが、 ファイルの最終行の改行コードを除去する方法が分からなくて困っています。 何か良い方法は無いでしょうか

    • 締切済み
    • PHP
  • C言語、ファイル操作、fgets()について

    次のプログラムは入力された行を読み込み、コマンドラインで指定されたファイルに書き込みます。 空白行が入力されたら、入力の終了とみなしてファイルを閉じます。続いてファイルを入力用に開き、 fgets()を使ってファイルの内容を表示するものです。 (ソースコードが長くてすみません) #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { FILE *fp; char str[80]; /* コマンドライン引数を検査する */ if(argc!=2) { printf("ファイル名を指定してください\n"); exit(1); } /* 出力用にファイルを開く */ if((fp = fopen(argv[1], "w"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } printf("終了するには空白行を入力してください\n"); do { printf(": "); gets(str); strcat(str, "\n"); /* 改行を追加する */ if(*str != '\n') fputs(str, fp); } while(*str != '\n'); fclose(fp); /* 入力用にファイルを開く */ if((fp = fopen(argv[1], "r"))==NULL) { printf("ファイルを開くことができません\n"); exit(1); } /* ファイルを読み込み直す */ do { fgets(str, 79, fp); if(!feof(fp)) printf(str); } while(!feof(fp)); fclose(fp); return 0; } 【質問】fgets()内のint型の数値「79」がどうして79なのかが分かりません。     80でも良いような気がするのですが・・・

  • fgetsでエラー

     C言語を勉強しているものです。 fgetsやfscanfで第一引数にダブルポインタ変数を用いるとエラーが出ます。 なぜそうなるんでしょうか? ダブルポインタだと不可能なんでしょうか? char **moji; FILE *fp; moji = (char**)malloc(sizeof(char*) * 128 * 256); fp = fopen("test.txt","r+"); fgets(moji[0], 26, fp); //ここでエラー mojiを[0]で指定してあげてもエラーなんでしょうか? fgetsだけでなくfscanfでもそうです。 どうしてそうなんるんでしょう?

  • TSVファイルを読み込んで表示したい

    $file="sample.txt"; // 変換対象TSVファイル $fpw = fopen($file,'r'); while (!feof($fpw)) {   $data = fgets($fpw));   $line = explode("\t", $data);   print "line= ".$line[0]."<br>";   print "line= ".$line[1]."<br>"; } としましたがうまく内容が表示されません。 どのようにしたら良いでしょうか?

    • ベストアンサー
    • PHP

専門家に質問してみよう