Автоматически увеличивать размер файла при поиске / записи в местоположение на потоковом диске для чтения / записи - PullRequest
2 голосов
/ 07 марта 2012

Я работаю над устаревшим кодом, который использует win32 WriteFile() для записи в случайное место в двоичном файле. Смещение записи может быть после конца файла, в этом случае 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 до offset?

1 Ответ

1 голос
/ 09 марта 2012

Вот пример, который я дословно выбрал из 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 в конце программы, т.е. выразрешено выполнять поиск за концом файла.

В любом случае, если запись не удалась для вас, вы можете проверить и посмотреть, выполняет ли поиск тоже.Если это произойдет, вы можете обнаружить ошибку раньше.

...