У меня есть код для Windows, который открывает файл как объект fstream
, используя ios::in|ios::out|ios::binary
. Я пытаюсь peek
1 байт, изменить его и записать обратно в файл в той же позиции. Это соответствующий код (примечание: _SH_DENYWR - это общий ресурс Windows, поэтому я могу записать в файл, но другие процессы не могут):
this->m_File.open(filename, ios::in | ios::out | ios::binary, _SH_DENYWR);
...
// Using peek here causes all subsequent writes to fail
// even though peek returns the correct value and is not
// peeking at the EOF
BYTE byte = this->m_File.peek();
BYTE high = binPattern[0].High;
BYTE low = binPattern[0].Low;
BYTE finalByte = byte;
if (high != this->WILDCARD && (byte >> 4) != high)
finalByte = (finalByte & 0x0f) | (high << 4);
if (low != this->WILDCARD && (byte & 0x0f) != low)
finalByte = (finalByte & 0xf0) | low;
this->m_File.write((char*)&finalByte, sizeof(BYTE));
// This seekp resets something in the stream and allows the next write to succeed
this->m_File.seekp(this->MAGIC_OFFSET, ios::beg);
this->m_File.write((char*)&this->PATCH_MAGIC, sizeof(DWORD));
...
Что я делаю неправильно с peek
и write