Я читаю блоки данных из файла, но не все сразу (например, 3 байта на чтение / запись), а затем записываю те же 3 байта обратно в файл в ту же самую позицию внутри файла, а затем продолжаю цикл до тех пор, пока не останется больше блоков для чтения.
Другими словами, я пытаюсь переписать файл по самому содержанию.
Однако существует проблема, заключающаяся в том, что конечный результат не совпадает с тем, который был в начале.
Следующий пример кода читает 3 байта за итерацию из файла «sample.txt», содержимое файла простое:
0123456789
после чтения данных и записи данных обратно в файл, содержимое:
012345345345
Как вы видите, данные по какой-то причине перезаписываются неправильно.
#include <fstream>
#include <iostream>
using namespace std;
#define BLOCK_SIZE 3
int main()
{
// open file
fstream file;
file.open("sample.txt", ios::binary | ios::out | ios::in);
// determine size and number of blocks to read
file.seekg(0, ios::end);
streampos size = file.tellg();
int blocks = size / BLOCK_SIZE;
cout << "size:\t" << size << endl;
if (size % BLOCK_SIZE != 0)
{
++blocks;
}
cout << "blocks:\t" << blocks << endl;
// return to beginning
file.seekg(ios::beg);
// we will read data here
unsigned char* data = new unsigned char[BLOCK_SIZE];
streampos pos;
// read blocks of data and write data back
for (int i = 0; i < blocks; ++i)
{
pos = file.tellg();
cout << "before read:\t" << pos << endl;
// read block
file.read(reinterpret_cast<char*>(data), BLOCK_SIZE);
cout << "after read:\t" << file.tellg() << endl;
// write same block back to same position
file.seekp(pos);
cout << "before write:\t" << file.tellg() << endl;
file.write(reinterpret_cast<char*>(data), BLOCK_SIZE);
cout << "after write:\t" << file.tellg() << endl;
// reset buffer
memset(data, 0, BLOCK_SIZE);
}
file.close();
delete[] data;
cin.get();
return 0;
}
Видите ли вы, в чем причина плохой перезаписи?
EDIT:
Извините, я не вижу, как связанный дубликат отвечает на мой вопрос, я просто не могу применить данный ответ к приведенному выше коду.