С++, Запись в файл, изменение местоположения данных!

программирование C++ qt WinAPI

В общем должна быть такая функция:
void moveData(UINT64 lastpos, UINT64 newpos);
эта функция должна правильно переписывать данные в файле!
Она должна данные от позиции lastpos записывать в позицию newpos!
Т.е. например если мне надо будет освободить место где нибудь в середине файла для навых данных, или затереть имеющиеся!
При этом размер файла может быть любым, и отрыв lastpos от newpos может быть тоже большим!
Т.е. надо читать/писать блоками!
Я не прошу составить мне код!
Сам пяцот раз уже пытался! но чета туплю, сам себя каждый раз исправляю!
Не могу с условиями! Как их правильно составить!
Помогите пожалуйста! накидайте алгоритм (поподробнее с условиями)

Примечание:
для навых данных

Примечание:
для новых данных

Примечание:
Я конечно и сам справлюсь позже!
Но просто сейчас времени нет, поэтому прошу помощи здесь!
Не ужели никто не поможет?

Примечание:
Пишу в QtCreator!

Примечание:
Да вот я уже составил функцию!
И вроде работает правильно!
Функцию удаления данных не привожу, т.к. проще всё равно ниче не придумать, любой сам догадается!
Привожу функцию вставки байт в нужное место в файле, со сдвигом всех остальных байт!
Мошь предложите че нового, или че изменить, упростить!
Пожалуйста напишите даже о том что нет вариантов, чтоб я побыстрее вопрос закрыл!
Вот мой код:


void SFile::add(qint64 position, qint64 length) // Класс SFile наследник QFile
{
// // первый вариант, однопроходное чтение, с этого я начал
// // потом подумал что буфер может не влезть в оперативку и накумекал другой (Ниже)
// if ((length < 1)||(position >= size()))
// return;
// qint64 ts = (file->size() + offset), // новый будущий размер файла
// firstpos = file->pos(), // позиция с которой начинаем читать (для сдвига)
// sz = (file->size() - lastpos); // размер буфера
// if (!file->seek(lastpos))
// return;
// char * buffer = new char[sz]; // сам буфер
// qint64 readed = file->read(buffer, sz); // читаем всё доконца
// file->resize(ts); // изменяем размер файла
// file->seek(lastpos + offset);
// file->write(buffer, sz); // пишем прочитанное
// file->seek(firstpos); // возвращаем указатель в исходное место
// delete[] buffer;

// новый способ - поблочное чтение
if ((length < 1)||(position >= size()))
return;
// bufSize - определяется в конструкторе класса, по умолчанию 2048 (байт)
// используется 2 буфера по понятным причинам
char * buffer = new char[bufSize];
char * buffer2 = new char[bufSize];
qint64 readed = 0, readed2 = 0, // скока прочитано
toread = (size() - position), // скока всего осталось прочитать
firstpos = pos(), // эт чтоб потом вернуть в исходное положение
ts = (size() + length), // также новый размер файла
thisreading = 0, // скока щас надо будет прочитать
readpos = position; // откуда читаем
qint64 writepos = (position + length); // куда пишем
resize(ts); // ставим новый размер
bool cont = true; // условие для цикла
while (cont) {
bool mnogo = (toread > bufSize); // условие для того скока щас читать (последний ли раз читаем)
thisreading = (mnogo ? bufSize : toread);
if (!thisreading)
cont = false; // последняя итерация цикла
toread = (mnogo ? (toread - bufSize) : 0); // уменьшаем оставшееся прочитать
if (thisreading) {
seek(readpos);
readed = read(buffer, thisreading); // читаем скока нужно в первый буфер
readpos += readed; // увеличиваем позицию чтения
} else { readed = 0; } // эт на всякий случай
if (readed2 > 0) { // пишем второй буфер если он удачно прочитан
seek(writepos);
write(buffer2, readed2);
readed2 = 0;
writepos += readed2;
}
mnogo = (toread > bufSize);
thisreading = (mnogo ? bufSize : toread);
if (!thisreading)
cont = false;
toread = (mnogo ? (toread - bufSize) : 0);
if (thisreading) { // читаем во второй
seek(readpos);
readed2 = read(buffer2, thisreading);
readpos += readed2;
} else { readed2 = 0; }
if (readed > 0) { // пишем первый
seek(writepos);
write(buffer, readed);
readed = 0;
writepos += readed;
}
}
seek(firstpos); // восстанавливаем позицию в файле
}
Ответы:
Вы бы хоть какую то заготовку свою написали, а то вы хотите чтобы вам тут все с нуля написали. Приложите хоть долю стараний.


13 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.