• ベストアンサー

fputsでの書込み→最初に書いたレコードが消える

data.txtと言うファイルに 1レコード50バイトのテキストを書込みたいのです 次のようなコマンドを使って; fseek($fp,$pos ); fputs($fp, $eeData."\n"); $posには1,51,101・・・が入ります 直前に書いたデータは書き込まれていますが その前に書いたデータが消えてしまいます fseekの使い方がいけないのでしょうか よろしくお願いします

  • ppmi
  • お礼率88% (331/372)
  • PHP
  • 回答数2
  • ありがとう数3

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

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

#1補足>質問文の内容から、ほとんど、シーケンシャルに書き込みしているようだったので、 #1でfseekが必要ないと回答しましたが、 部分書き込みをするなら、 fseekで位置づけして、 fputsで書き込みでできます。 念のために、テストしてみましたが問題有りませんでした。 なお、windowsの環境では、改行コードの扱いがUNIX環境とは違うので注意が必要です。 winodwsで試してみましたが、 "ABCDEF\n"をfputsで書き込んだ場合、 私の環境では、 "\n"が0x0Aで書き込まれました。 "\r\n"にすると 0x0D0Aになりうまく置き換えができました。 fseekのオフセット($pos)は、0オリジン(0で始まる)です。 例えば 123456789 ABCDEFGHI abcdefghi の様なデータの時、 各行の先頭のオフセットは、 0,11,22 です。(改行コードで2バイト) 環境によって異なりますが その辺も考慮されて、プログラムされるといいのではないかと思います。 あと、fseekが成功しているかどうかも調べた方がいいかもしれません。 テストの段階では、 r+モードでfopenして、fseekで位置づけした位置で予想したレコードが読めるかどうかもやってみた方がいいかもしれません。

ppmi
質問者

お礼

詳しく解説していただき ありがとうございました 一歩前進することができました

その他の回答 (1)

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

fseekは、必要ないんじゃないでしょうか

ppmi
質問者

補足

返事ありがとうございました。 fseekは現在ファイルに1000バイトのデータが 入っているとすると、51バイト目~100バイト の部分を書き換えるのに使おうと思ったのですが そもそも、fputsはそういう、部分writeはできない んですかね?

関連するQ&A

  • 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で行っています。

  • fputsに関して

    php初心者です。 ファイル書き込みで困っているので知っている方がいたら教えて下さい。 環境はphp5です。 //////////////////////////////////////// $fp = @fopen("書き込むファイルへのパス", "w") or die ("error\n"); fputs($fp, "<?php include(\"test.inc\"); ?>"); //////////////////////////////////////// 上記のようにしたいと考えていますが、上手く出来ません・・・。 書き込んだテキストがphpで、それを動作させたいです。 色々調べては見てるのですが、そのようなドキュメントが見つからなく困っております。 よろしくお願いします。

    • 締切済み
    • PHP
  • fputsで改行できない

    $construction='aaa'; $explanation='bbb'; define(DATA, './data'); $fp = fopen(DATA . '/' . $name, 'w') or die('ファイルを開けません'); flock($fp, LOCK_EX); fputs($fp, $construction . "\\r\\n" . $explanation) or die ('ファイルに書き込めません'); fclose($fp); 作成されたファイルを開いてみると aaa\r\nbbbと表示され、改行されません。 "\\r\\n"ではなく"\\n"のみにしても同様です。 二十引用符にしているのに、改行されません。 fputsに複数の変数を同時に入れ、それぞれの間に改行をいれるにはどうすればよいでしょうか? 文字コードはShift-JISです。 ご教示頂けると幸いです。 宜しくお願い致します。

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

    こんにちは、趣味でプログラミングをしている者です。 さっそくですが質問させていただきます。 php で何かを作ったことはないのですが すこし勉強してみようと思い、 インターネットでphpの記事を見たりしていたところ、 次のような例文を見つけました。 <?php $http_response = ''; $fp = fsockopen('www.php.net', 80); fputs($fp, "GET / HTTP/1.1\r\n"); fputs($fp, "Host: www.php.net\r\n\r\n"); while (!feof($fp)) { $http_response .= fgets($fp, 128); } fclose($fp); echo nl2br(htmlentities($http_response)); ?> この例文の処理はなんとなくわかるのですが、 上記の例文で、fputs について調べようと思い以下のサイトの 記事を見ました http://www.php.net/manual/ja/function.fputs.php そこには次のように書かれていました。 fputs fwrite() のエイリアス そこで質問させていただきたいのですが、 エイリアスとはどのようなものなのでしょうか? windows のエクスプローラでいえばショートカットのような ものでしょうか? 例文で fwrite を使ってもよいのでしょうか? ご存知のかた、教えていただけないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 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
  • 構造体のファイル書き込み&読み出しに関して2

    C言語を勉強しているものです。指定した番号に構造体を書き込み、指定した番号をの構造体を出力するプログラムを作成したいのですが、表示結果画像のようになってしまいます。 デバックしても、どこが違うのかがわかりません。説明不足かとは思いますがご教授お願いします。 ↓↓ソースコード↓↓ #include<stdio.h> #include<stdlib.h> struct S_data{ char Name[10+1];/*名前*/ int Sex;/*性別*/ int Height;/*身長*/ float Weight;/*体重*/ }; void FR_data(FILE *Fp,int pos); void FW_data(FILE *Fp,int pos); void OUP_data(struct S_data tag); void INP_data(struct S_data *tag); int RF_data(FILE *Fp,struct S_data *tag,int pos); int WF_data(FILE *Fp,struct S_data *tag,int pos); void main(){ FILE *Fp; int pos=0; int Ret; Fp=fopen("aaa.dat","r+b"); if(Fp==NULL){ Fp=fopen("aaa.dat","w+b"); if(Fp==NULL){ printf("File not open\n"); exit(2); } } while(1){ printf("入力の番号[0:終了]->"); scanf("%d",&pos); if(pos==0) break; FW_data(Fp,pos); } while(1){ printf("出力の番号[0:終了]->"); scanf("%d",&pos); if(pos==0) break; FR_data(Fp,pos); } Ret=fclose(Fp); } void FR_data(FILE *Fp,int pos){ struct S_data Temp; /*出力情報*/ int Ret; /*返却値*/ memset(&Temp,'\0',sizeof(Temp)); Ret=RF_data(Fp,&Temp,pos); /*情報の読み込み*/ if (Ret!=1){ printf("File not read\n"); }else{ OUP_data(Temp); /*情報の表示*/ } } void FW_data(FILE *Fp,int pos){ struct S_data wk; /*入力情報*/ int Ret; /*返却値*/ memset(&wk,'\0',sizeof(wk)); INP_data(&wk); /*情報の入力*/ Ret=WF_data(Fp,&wk,pos); /*情報の書き込み*/ if (Ret!=1){ printf("File not write\n"); } } void OUP_data(struct S_data tag){ printf("Name:%s\n",tag.Name); if (tag.Sex==0){ printf("Sex:M\n"); }else{ printf("Sex:F\n"); } printf("Height:%d\n",tag.Height); printf("Weight:%.2f\n",tag.Weight); } void INP_data(struct S_data *tag){ memset(tag,'\0',sizeof(tag)); printf("Name-->"); scanf("%s",&tag->Name); printf("Sex[0:M1:F]-->"); scanf("%d",&tag->Sex); printf("Height-->"); scanf("%d",&tag->Height); printf("Weight-->"); scanf("%f",&tag->Weight); } int RF_data(FILE *Fp,struct S_data *tag,int pos){ int Ret_I; /*fseek返却値*/ size_t Ret_S; /*fread返却値*/ Ret_I=fseek(Fp,sizeof(tag)*(pos),SEEK_SET); Ret_S=fread(tag,sizeof(tag),1,Fp); return Ret_S; } int WF_data(FILE *Fp,struct S_data *tag,int pos){ int Ret_I; /*fseek返却値*/ size_t Ret_S; /*fwrite返却値*/ Ret_I=fseek(Fp,sizeof(tag)*(pos),SEEK_SET); Ret_S=fwrite(tag,sizeof(tag),1,Fp); return Ret_S; }

  • 追加書き込みと改行コードについて

     お世話になっております。  PHPの初心者です。  PHPの追加書き込みの件で質問です。テキストファイルにテキストを追加書き込みしようと思い、以下のように書きました。 $fp = fopen('data.txt', 'a'); flock($fp, LOCK_EX); $return = fputs($fp, "$namen"); flock($fp, LOCK_UN); fclose($fp);  これでファイルに追加で書き込みはできるのですが、文末に直接つながってしまい改行されないですよね?一度書き込まれるごとに改行したいのですが、改行コードが\nでは追加で書き込みができなくなってしまいました。$returnの値がゼロになってしまいファイルに何も書き込まれなくなってしまいました。 $return = fputs($fp, "$namen\n"); ←この部分に\nを書き足しました。  文字コードはUTF-8で書き、改行コードはLFで統一しています。  PHPの改行コードについてわかる方がいましたらおしえてください。  

    • 締切済み
    • PHP
  • ファイルへの書き込み

    フォームに入力されたデータをCSVファイルに書き込みたいのですが、以下のようにすると追加で書き込みはできるのですが、ずっと改行されずに1行に書き込まれてしまうので、新しいデータを入れる際に改行されるようにしたいのですが、どのようにすればいいでしょうか? $fp = fopen(TEST_FILE,"a") or die("ファイルを開けません\n"); flock($fp, LOCK_EX); fputs($fp, "aaa")."\n"; flock($fp, LOCK_UN); fclose($fp);

    • ベストアンサー
    • PHP
  • 複数テキストファイルを読み込み、複数テキストファイルの出力

    質問は100個のテキストファイル(それぞれ10個のデータを含む)を読み込み、それぞれのテキストファイルから5個ずつデータを抽出し、200個のテキストファイルとして出力するというプログラムについての質問です。 以下が僕の作ったファイル出力部分のプログラムです。 /************/ void ecg_rr(fp,data_max) FILE *fp; { int b,i=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i=0;i<100;i++) sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0]); fprintf(fp,"%8.8f\n",data[0][2]); fprintf(fp,"%8.8f\n",data[0][4]); fprintf(fp,"%8.8f\n",data[0][6]); fclose(fp); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1]); fprintf(fp,"%8.8f\n",data[0][3]); fprintf(fp,"%8.8f\n",data[0][5]); fprintf(fp,"%8.8f\n",data[0][9]); fclose(fp); } 複数ファイルの読み込み方がわからず、自分のプログラムだと1つのテキストファイルしか読み込めないので、16_4.batを作り、その中身を 16_4 読み込むテキストファイル名1.txt ss[1] 16_4 読み込むテキストファイル名1.txt sk[1] 16_4 読み込むテキストファイル名2.txt ss[2] 16_4 読み込むテキストファイル名2.txt sk[2] ・・・ とやったのですが、うまくいきませんでした。 どうすればよいのでしょうか。

  • fputs:ファイル操作

    Cを勉強している初心者です。 このソースはコンパイルは通るのですが、 エラーがでてしまいます。 いろいろと調べてみたりもしたのですが わかりませんでした。 なぜなのでしょうか? #include <stdio.h> #include <string.h> struct student{ char name[20]; }; int main(void) { struct student s[1]; int i; int j = 1; FILE *fp; strcpy(s[0].name,"taro"); strcpy(s[1].name,"jiro"); if((fp = fopen("test.txt","w+")) == NULL) { printf("ファイルを開けませんでした\n"); return (-1); } for(i=0;i<=j;i++) { fputs(s[i].name,fp); } fclose(fp); return (0); }

専門家に質問してみよう