2010-02-18 3 views
5

Я думаю, что мне, вероятно, придется использовать объект fstream, но я не уверен, как это сделать. По сути, я хочу читать в файле в байтовый буфер, изменять его, а затем переписывать эти байты в файл. Поэтому мне просто нужно знать, как делать байты ввода/вывода.Чтение и запись байтов из файла (C++)

+2

Вы хотите открыть его в двоичном режиме. – GManNickG

+1

@GManNickG Этого недостаточно. Если этого не сделать, это заставит вас ударить головой о стену в течение часа или около того со случайными ошибками. Например, код работает, если вы вставляете случайный 'cout << file_stream.tellg();' где-то и не работает иначе. – Tibor

ответ

7
#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(); 

Из памяти я думаю, что так оно и есть.

+0

Я обычно делаю их динамическими, потому что я бы не поставил их в одну функцию likfe – Craig

+4

Вам все равно нужно удалить m_content после использования нового. C++ не содержит сборку мусора. Также 1024 байта должны вставляться в стек довольно легко, поэтому просто используйте 'char m_content [1024];' –

+0

^Да, не забывайте, что: D. – Craig

0

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

while (fileBufferHere.good()) { 
    filebufferHere.getline(m_content, 1024) 
    /* Do your work */ 
} 
1

Если вы имеете дело с небольшим размером файла, я рекомендую вам просто прочитать весь файл. Затем работайте с буфером и снова напишите весь блок. Они показывают вам, как читать блок - при условии, что вы заполняете открытый файл ввода/вывода сверху ответа.

// 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 
    .......... 
+0

Или должен был просто изменить буфер и записать его обратно. –

+0

Все зависит от типа модификации. Было бы проще, если бы это была одна-единственная замена одного или нескольких байтов в потоке. Однако, если изменение добавит к нему больше байтов, это может вызвать исключение переполнения памяти, что является общей ошибкой. –