0

そのため、作成して初期化するバイナリ ファイルがあります。ポインターを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てみましたが、何も得られませんでした。

4

2 に答える 2

0

これを一歩ずつ進めることをお勧めします。コードは問題ないように見えますが、エラー チェックが行われていないということは、何らかの動作が発生している可能性があることを意味します。上のすべての操作にエラー チェックとレポートを追加します。問題がない場合は、単純なシークを実行してから書き込みます。

result = in.pseek(26);
//print result 
result = in.write("Hello World",10);
// print result
in.close();

何が起こるかを知らせます

于 2011-05-05T04:55:01.457 に答える
0

最終的な問題は、ファイル ストリームに関する私の理解ではありませんでした。バイナリファイルに対する私の理解不足でした。改行はすべてを王道に台無しにし、ある時点で問題なく追加できましたが、後でそれを処理するのは非常に面倒でした. それを削除すると、他のすべてがうまく収まりました。そして、多くのエラーチェックやファイルのクローズの欠如が存在する理由は、それが単なるドライバーコードであるためです. その時点でファイルに何が起こったのかは気にしませんでした。ファイルが開かれていることはわかっていました。なぜ私の時間を無駄にするのですか?最終版ではメインプログラムを書き直した際にエラーチェックを行います。私が言ったように、私が得られなかったのはバイナリファイルであり、ファイルストリームではありませんでした. したがって、AJ の回答はまったく役に立ちませんでした。課題の一部として 25 の文字を持たなければなりませんでした。名前の長さは 25 文字ではないため、がらくたでいっぱいになります。それはプロジェクトの副産物であり、スペースで埋めようとする以外に私にできることは何もありません。先にスキップしてそこから書くよりも時間がかかります. そこで、おそらく平均的な名前 (8 文字) と思われる名前を書き、その後 25 桁先にジャンプすることにしました。ここで与えられたと言える唯一の本当の解決策は、16進エディタを入手するように私に言ったエミールからのものでした. それは本当に役に立ちました。御時間ありがとうございます。ここで与えられたと言える唯一の本当の解決策は、16進エディタを入手するように私に言ったエミールからのものでした. それは本当に役に立ちました。御時間ありがとうございます。ここで与えられたと言える唯一の本当の解決策は、16進エディタを入手するように私に言ったエミールからのものでした. それは本当に役に立ちました。御時間ありがとうございます。

于 2011-05-05T07:33:41.747 に答える