はじめまして、dtです。
ランダムファイルについて質問があります。
既に、あるファイルを開いて、一行を書き換えたいのですが、
うまく行かないのです。
例:
最初の一行に書き換えたいのですが
buf2=FH+str_0+str_3+str_4+str_5; //書き換える内容
fp8 = fopen(SavePathName2, a+);
if(!fp8){
return ;
}
//fseek(fp8, 0, SEEK_SET);
rewind(fp8);
fputs(buf2, fp8);
fclose(fp8);
結果としてはファイルの最後に追加されました。
よろしくお願い致します。
環境:Win2000 .Net Ver2000 MFC使用
---- MSDNによりますと ----
> ファイルを a または a+ のアクセス モードで開くと、書き込み操作はすべて
> ファイルの終端から行われます。ファイル ポインタは fseek 関数または rewind
> 関数で移動できますが、書き込み操作の前に必ずファイルの終端に戻されます。
> したがって、既存のデータは上書きされません。
επιστημηさん
ご返事ありがとう.
一行を上書したいのですが、いい方法があるのでしょうか。
よろしくお願いします。
r+で開けてはいかがでしょ
行の長さが変わらなければそれでもいいけど、変わるようならダメ
素直に別ファイルにするほうがよさそうな気のせい?
> 行の長さが変わらなければそれでもいいけど、変わるようならダメ
気になってはいたんだけど、タイトルで「ランダムファイル」と言い
切ってるから百も承知二百も合点かなー、と。
επιστημη さん、tetrapodさん
ご返事ありがとう。
>r+で開けてはいかがでしょ
なるほど、r+でうまく行きました。
>行の長さが変わらなければそれでもいいけど、変わるようならダメ
>素直に別ファイルにするほうがよさそうな気のせい?
そうですね、これから質問しようと思っています。
追加の行は>=元の行であれば、問題がなくうまくできました。
で、
追加の行は<元の行であれば、余分が残っています。
今,自分で考えているのは、
元のAファイルをコピーして、Bファイルが生成します。
Bファイルへ第一行を書き込む(buf2)、
Aファイルに残るの行は、一行一行づつBファイルへコピーすること。
かなり面倒のことですが。
最適な解決の方法どの方法でしょうか。
よろしくお願いします。
> 追加の行は>=元の行であれば、問題がなくうまくできました。
ホント? 二行目をぶっ壊してんじゃない?
> 元のAファイルをコピーして、Bファイルが生成します。
> Bファイルへ第一行を書き込む(buf2)、
> Aファイルに残るの行は、一行一行づつBファイルへコピーすること。
つまりランダムアクセス・ファイルじゃありませんね。
それは単なるシーケンシャル・ファイル。
残りの行を複写するのに一行ずつコピーする必要はありません。
バイナリファイルと同様、どかっとコピーすればいい。
あるいは一行の最大長が決まっているなら、全部その長さで揃えてしまう。
そうすればホントのランダムアクセス・ファイルとなります。
ご返事ありがとう.
>> 追加の行は>=元の行であれば、問題がなくうまくできました。
>ホント? 二行目をぶっ壊してんじゃない?
すみません、追加の行==元の行であれば,問題がない。
>それは単なるシーケンシャル・ファイル。
はい、そうです。タイトルも変ります(シーケンシャル・ファイルについて)。
>バイナリファイルと同様、どかっとコピーすればいい。
どの関数を使えばいいでしょうか。
よろしくお願い致します。
>>バイナリファイルと同様、どかっとコピーすればいい。
> どの関数を使えばいいでしょうか。
fread/fwrite
επιστημηさん、瀬戸っぷ さん:
ご返事ありがとう。
>fread/fwrite
一行のバイト数が不定ですが、fread/fwriteが使いにくいです。
量が大きいファイルの場合、一括に読込みとバッファのサイズも大きくになった。
>こっちで既に進行中でしたか。
>タイトルと投稿者名から見ておけばよかった…
すみません、発言のボタンが2回押したのです、もう一個削除しようと思っていますが、
できませんでした。
>……
>後者の場合、書き込み中にエラーとかで終了すると元ファイルの内容が失われたり、ファ
>イルサイズによっては問題ありますが。
fp8 = fopen(SavePathName2, r);
fp9 = fopen(NewPathName, w);
fgets(buf, 256, fp8);
while (fgets(buf, 256, fp8) !=NULL)
{
fputs(buf, fp9); //fp8の行単位コピーfp9
}
fclose(fp9);
fclose(fp8);
//元のファイルを削除
DeleteFile(SavePathName2);
//ファイル名変更=>元のファイル名に戻る
rename(NewPathName, SavePathName2);
そういうことしました。
いろいろ教えていただき、ありがとうございました。
修正
fp8 = fopen(SavePathName2, r);
fp9 = fopen(NewPathName, w);
fputs(buf2, fp9); //書き込み
fgets(buf, 256, fp8); //読み飛ばし
while (fgets(buf, 256, fp8) !=NULL)
{
fputs(buf, fp9); //fp8の行単位コピーfp9
}
fclose(fp9);
fclose(fp8);
//元のファイルを削除
DeleteFile(SavePathName2);
//ファイル名変更=>元のファイル名に戻る
rename(NewPathName, SavePathName2);