そのため、作成して初期化するバイナリ ファイルがあります。ポインターをseekg = 0
またはに設定seekp = 0
すると、テキスト行をうまく上書きできます。ただし、26 バイト先にジャンプすると (ファイルの 1 行のサイズであり、確かに確認したことです)、上書きを拒否します。代わりに、バイナリ データの前にそれを追加し、古いデータをさらに行にプッシュします。データを完全に上書きしたい。
char space1[2] = { ',' , ' '};
int main()
{
CarHashFile lead;
lead.createFile(8, cout);
fstream in;
char* tempS;
tempS = new char[25];
in.open("CarHash.dat", ios::binary | ios::in | ios::out);
int x = 2000;
for(int i = 0; i < 6; i++)
tempS[i] = 'a';
int T = 30;
in.seekp(26); //Start of second line
in.write(tempS, 6); //Will not delete anything, will push
in.write(space1, sizeof(space1)); //contents back
in.write((char *)(&T), sizeof(T));
in.write(space1, sizeof(space1));
in.write(tempS,6);
in.write(space1, sizeof(space1));
in.write((char *)&x, sizeof(x));
//Now we will use seekp(0) and write to the first line
//it WILL overwrite the first line perfectly fine
in.seekp(0);
in.write(tempS, 6);
in.write((char*) &x, sizeof(x));
in.write(tempS, 6);
in.write((char *) &T, sizeof(T));
return 0;
}
はCarHashFile
、create file が呼び出されたときに次の内容でいっぱいのバイナリ ファイルを作成する外部クラスです: "Free, "
1900
", Black, $"
0.00f
. 引用符で囲まれたものはすべて文字列として追加され、1900 は int として追加され、0.00f は明らかに float として追加されました。これらはすべて write で追加したので、実際のバイナリ ファイルであると確信しています。最初の行だけを上書きすることを選択する理由がわかりません。ファイルサイズが正しいことはわかっています。設定seekp = 26
すると、2行目の先頭に印刷されて押し下げられるからです。space
「、」コンボをファイルに簡単に追加するために作成されました。簡単にするためのchar dol[1] = '$'
配列とchar nl[1] = '\n'
、バイナリファイルに新しい行を追加できる もあります(そのバイナリ追加を削除しようとしたところ、すべてが 1 つの行に強制されたので、私の知る限り、それが必要です)。
編集:わかりました、それはずっと行を消去していました、それは新しい行を入れていませんでした(ちょっと恥ずかしい)。しかし、ファイルに改行を挿入する方法がわかりません。元のやり方で書いてみましたchar nl[1] = { '\n' }
。ファイルを最初に作成したときは機能しましたが、その後は機能しません。行を追加する他の方法はありますか? 私も試しin << endl
てみましたが、何も得られませんでした。