ランダムファイルについて – プログラミング – Home

ランダムファイルについて
 
通知
すべてクリア

[解決済] ランダムファイルについて


dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

はじめまして、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使用


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

---- MSDNによりますと ----
> ファイルを a または a+ のアクセス モードで開くと、書き込み操作はすべて
> ファイルの終端から行われます。ファイル ポインタは fseek 関数または rewind
> 関数で移動できますが、書き込み操作の前に必ずファイルの終端に戻されます。
> したがって、既存のデータは上書きされません。


返信引用
dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

επιστημηさん
ご返事ありがとう.

一行を上書したいのですが、いい方法があるのでしょうか。

よろしくお願いします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

r+で開けてはいかがでしょ


返信引用
tetrapod
 tetrapod
(@tetrapod)
ゲスト
結合: 21年前
投稿: 830
 

行の長さが変わらなければそれでもいいけど、変わるようならダメ
素直に別ファイルにするほうがよさそうな気のせい?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 行の長さが変わらなければそれでもいいけど、変わるようならダメ

気になってはいたんだけど、タイトルで「ランダムファイル」と言い
切ってるから百も承知二百も合点かなー、と。


返信引用
dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

επιστημη さん、tetrapodさん
ご返事ありがとう。

>r+で開けてはいかがでしょ
なるほど、r+でうまく行きました。

>行の長さが変わらなければそれでもいいけど、変わるようならダメ
>素直に別ファイルにするほうがよさそうな気のせい?

そうですね、これから質問しようと思っています。
追加の行は>=元の行であれば、問題がなくうまくできました。
で、
追加の行は<元の行であれば、余分が残っています。
今,自分で考えているのは、
元のAファイルをコピーして、Bファイルが生成します。
Bファイルへ第一行を書き込む(buf2)、
Aファイルに残るの行は、一行一行づつBファイルへコピーすること。
かなり面倒のことですが。
最適な解決の方法どの方法でしょうか。

よろしくお願いします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 追加の行は>=元の行であれば、問題がなくうまくできました。

ホント? 二行目をぶっ壊してんじゃない?

> 元のAファイルをコピーして、Bファイルが生成します。
> Bファイルへ第一行を書き込む(buf2)、
> Aファイルに残るの行は、一行一行づつBファイルへコピーすること。

つまりランダムアクセス・ファイルじゃありませんね。
それは単なるシーケンシャル・ファイル。
残りの行を複写するのに一行ずつコピーする必要はありません。
バイナリファイルと同様、どかっとコピーすればいい。

あるいは一行の最大長が決まっているなら、全部その長さで揃えてしまう。
そうすればホントのランダムアクセス・ファイルとなります。


返信引用
dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

ご返事ありがとう.

>> 追加の行は>=元の行であれば、問題がなくうまくできました。

>ホント? 二行目をぶっ壊してんじゃない?

すみません、追加の行==元の行であれば,問題がない。

>それは単なるシーケンシャル・ファイル。
はい、そうです。タイトルも変ります(シーケンシャル・ファイルについて)。

>バイナリファイルと同様、どかっとコピーすればいい。
どの関数を使えばいいでしょうか。

よろしくお願い致します。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

>>バイナリファイルと同様、どかっとコピーすればいい。
> どの関数を使えばいいでしょうか。

fread/fwrite


返信引用
dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

επιστημηさん、瀬戸っぷ さん:
ご返事ありがとう。

>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);
そういうことしました。

いろいろ教えていただき、ありがとうございました。


返信引用
dt
 dt
(@dt)
ゲスト
結合: 23年前
投稿: 31
Topic starter  

修正
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);


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました