4

WriteFile()win32を使用してバイナリ ファイルのランダムな場所に書き込むレガシー コードに取り組んでいます。書き込みのオフセットは、ファイルの末尾を超える可能性があります。その場合WriteFile()、ファイル サイズがオフセットまで自動的に拡張され、データがファイルに書き込まれます。

同じことをしたいstd::fstreamのですが、適切な場所に移動しようとするseekp()と、ファイルの終わりを過ぎてseekp()失敗し、その後write()も失敗します。

そのため、現在の EOF と書き込みたい場所の間のスペースを「手動で」埋める必要があるように思えます。

コードは次のようになります。

void Save(size_t offset, const Element& element)
{
    m_File.seekp(offset, std::ios_base::beg);
    m_File.write(reinterpret_cast<const char*>(&element), sizeof(Element));
    if (m_File.fail()) {
        // ... error handling
    }
}

0では、現在の EOF から まで sを「手動で」書き込む唯一のオプションはありますoffsetか?

4

1 に答える 1

2

これは私がMSDNから逐語的に取り上げた例です:

// basic_ostream_seekp.cpp
// compile with: /EHsc
#include <fstream>
#include <iostream>

int main()
{
    using namespace std;
    ofstream x("basic_ostream_seekp.txt");
    streamoff i = x.tellp();
    cout << i << endl;
    x << "testing";
    i = x.tellp();
    cout << i << endl;
    x.seekp(2);   // Put char in third char position in file
    x << " ";

    x.seekp(2, ios::end);   // Put char two after end of file
    x << "z";
}

ファイル「basic_ostream_seekp.txt」はte ting\0\0zプログラムの最後にあります。つまり、ファイルの最後を超えてシークすることができます。

いずれにせよ、書き込みが失敗した場合は、seekpも失敗するかどうかを確認できます。含まれている場合は、障害を早期に検出できます。

于 2012-03-09T19:41:03.220 に答える