ファイルポインタを使用したファイル操作について質問があります。
まず、下記のように書き込みファイルを開いているとします。
FILE *fp;
fp = fopen(Test.txt,wt);
そしてこのファイルへ文字列を書き込みます。
fputc(Test1\n,fp);
fputc(Test2\n,fp);
fputc(Test3\n,fp);
fputc(Test4\n,fp);
その後、fseek関数によりファイルポインタを先頭に戻し、
追加をしようとして
fseek(fp, 0, SEEK_SET);
fputc(Test5\n,fp);
fputc(Test6\n,fp);
fputc(Test7\n,fp);
fputc(Test8\n,fp);
のように書いたら、Test1~Test4にTest5~Test8が
上書きされてしまいます。
どのようにしたらファイルの先頭に追加する事が出来るのでしょうか?
fopenの第2引数を色々と代えてやってみたのですが、
上手く行きません…。
第2引数をatに変えてみたら末尾に追加されるだけでした。
開発環境はVC++6.0にWinXPです。
宜しくお願いします。
>fputc(Test1\n,fp);
書き間違えました。
正しくはfputsです。
> ファイルポインタを使用したファイル操作について質問があります。
> まず、下記のように書き込みファイルを開いているとします。
> FILE *fp;
> fp = fopen(Test.txt,wt);
wtってなんでしょうか??
もしかしてw+の間違いでは??
> その後、fseek関数によりファイルポインタを先頭に戻し、
> 追加をしようとして
> fseek(fp, 0, SEEK_SET);
> fputs(Test5\n,fp);
> fputs(Test6\n,fp);
> fputs(Test7\n,fp);
> fputs(Test8\n,fp);
> のように書いたら、Test1~Test4にTest5~Test8が
> 上書きされてしまいます。
> どのようにしたらファイルの先頭に追加する事が出来るのでしょうか?
ファイル先頭に「追記」はできません。
新しくファイルを作って、先頭に追加したい分を先に書き込み
その後で元ファイルのデータをコピーする方法をがあります。
(さらにその後元ファイルを削除してから書き込んだファイルをリネームする)
あるいは、元ファイルの内容を全てメモリに読み込み、
(クローズしてから)新規作成で同名ファイルをwモードでオープンし、
先頭に追加したい分を書き出してからメモリに読み込んだ内容を書き出して下さい。
瀬戸っぷさん、レス有難う御座います。
>wtってなんでしょうか??
>もしかしてw+の間違いでは??
あれっ?テキストモードで開く時はこんな風に
書くのでは無いのですか?
ちょっとこちらもあいまいな所があるもので…。
>ファイル先頭に「追記」はできません。
>新しくファイルを作って、先頭に追加したい分を先に書き込み
>その後で元ファイルのデータをコピーする方法をがあります。
>(さらにその後元ファイルを削除してから書き込んだファイルをリネームする)
>あるいは、元ファイルの内容を全てメモリに読み込み、
>(クローズしてから)新規作成で同名ファイルをwモードでオープンし、
>先頭に追加したい分を書き出してからメモリに読み込んだ内容を書き出して下さい。
そうですか…やっぱり無理なんですね。
別々のファイルに明記して、その後に全てを合わせるしかないですね。
レス有難う御座います。
> >wtってなんでしょうか??
> >もしかしてw+の間違いでは??
> あれっ?テキストモードで開く時はこんな風に
> 書くのでは無いのですか?
VC++ 6.0とのことなので,これでもOKです。
http://www.microsoft.com/japan/msdn/library/ja/vclib/html/_crt_fopen.2c_.
_wfopen.asp
ただし,mode文字列中のフラグで,t/c/n/S/R/T/Nは非標準(Microsoft固有)なので,
必要でないなら使わない方がよいかもしれないです。
#例の直前に小さく書いてある。