Я думаю, что мне, вероятно, придется использовать объект fstream, но я не уверен, как это сделать. По сути, я хочу читать в файле в байтовый буфер, изменять его, а затем переписывать эти байты в файл. Поэтому мне просто нужно знать, как делать байты ввода/вывода.Чтение и запись байтов из файла (C++)
ответ
#include <fstream>
ifstream fileBuffer("input file path", ios::in|ios::binary);
ofstream outputBuffer("output file path", ios::out|ios::binary);
char input[1024];
char output[1024];
if (fileBuffer.is_open())
{
fileBuffer.seekg(0, ios::beg);
fileBuffer.getline(input, 1024);
}
// Modify output here.
outputBuffer.write(output, sizeof(output));
outputBuffer.close();
fileBuffer.close();
Из памяти я думаю, что так оно и есть.
Я обычно делаю их динамическими, потому что я бы не поставил их в одну функцию likfe – Craig
Вам все равно нужно удалить m_content после использования нового. C++ не содержит сборку мусора. Также 1024 байта должны вставляться в стек довольно легко, поэтому просто используйте 'char m_content [1024];' –
^Да, не забывайте, что: D. – Craig
Выполняя ввод/вывод файлов, вам нужно будет прочитать файл в цикле, проверяя условия конца файла и ошибки. Вы можете использовать приведенный выше код, подобный этому
while (fileBufferHere.good()) {
filebufferHere.getline(m_content, 1024)
/* Do your work */
}
Если вы имеете дело с небольшим размером файла, я рекомендую вам просто прочитать весь файл. Затем работайте с буфером и снова напишите весь блок. Они показывают вам, как читать блок - при условии, что вы заполняете открытый файл ввода/вывода сверху ответа.
// open the file stream
.....
// use seek to find the length, the you can create a buffer of that size
input.seekg (0, ios::end);
int length = input.tellg();
input.seekg (0, ios::beg);
buffer = new char [length];
input.read (buffer,length);
// do something with the buffer here
............
// write it back out, assuming you now have allocated a new buffer
output.write(newBuffer, sizeof(newBuffer));
delete buffer;
delete newBuffer;
// close the file
..........
Или должен был просто изменить буфер и записать его обратно. –
Все зависит от типа модификации. Было бы проще, если бы это была одна-единственная замена одного или нескольких байтов в потоке. Однако, если изменение добавит к нему больше байтов, это может вызвать исключение переполнения памяти, что является общей ошибкой. –
Вы хотите открыть его в двоичном режиме. – GManNickG
@GManNickG Этого недостаточно. Если этого не сделать, это заставит вас ударить головой о стену в течение часа или около того со случайными ошибками. Например, код работает, если вы вставляете случайный 'cout << file_stream.tellg();' где-то и не работает иначе. – Tibor