Помогите допилить решение задачи С++ запись и чтение с файла

Дан символьный файл А. Переписать в файл В сначала все нечётные его символы, а затем все чётные в обратном порядке.

При записи в файл забивается мусор вперемешку с данными.

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    const char * fileNameWrite = "write.txt";
    const char * fileNameRead = "main.txt";
    ifstream read;
    ofstream write;             
    write.open(fileNameWrite,ios::app);
    read.open(fileNameRead,ios::in|ios::binary);
    int size = 255;
    if(read.is_open())
    {
        char * buffer = new char[size+1];
        buffer[size]= 0;
        read.get(buffer,size);
        for ( int i = 0; i < size; i++ ) {
            if( i % 2 != 0 ) {
                write << buffer[i];
            }
        }
        write.open(fileNameWrite,ios::app | ios::ate);
        for ( int i = size -1 ; i >= 0; i-- ) {
            if( i % 2 == 0) {
                write << buffer[i];
            }
        }
        delete buffer;
    }read.close();
}

Ответы (1 шт):

Автор решения: DmitryK

Есть тут немного ошибок. Самая основная - Вы почему-то считаете, что у из файла считается ровно size символов. А это не так. В циклах вы выводите буфер, основываясь на размере буфера, а не на количестве считанных элементов. Если вы считали 10 символов, то нужно вывести 5 нечетных, а потом 5 четных. А вы всегда выводите size символов.

for ( int i = 0; i < size; i++ )
    if( i % 2 != 0 ) 
       write << buffer[i];

Поэтому и пишется мусор. Кроме того, а если файл больше, чем буфер? Нужно посмотреть размер данных в файле, запомнить его в size, выделить нужный буфер и считать в него эти данные.
Попробуйте создать входной файл из ровно 255 символов. Всё заработает. Хотя это называется подгонять входные данные под неправильно работающую программу.
Ну и по мелочам. Файл на запись уже открыт, зачем открывать его ещё раз между циклами?

        write.open(fileNameWrite,ios::app | ios::ate);
        for ( int i = size -1 ; i >= 0; i-- )

У Вас утечка памяти. То, что выделялось при помощи new[], должно удаляться при через delete[], а не delete

delete buffer;

Файл на запись открываете в режиме дополнения и не в бинарном, хотя на чтение - в бинарном. В итоге после каждого запуска программы туда добавляется вывод, а не записывается с нуля. Надо как-то так:

    write.open( fileNameWrite, ios::binary);
     read.open( fileNameRead, ios::binary);

Для чтения и записи в бинарном режиме у потоков есть функции read() и write(), которые читают/пишут определенное количество байт, не обращая внимание на раздели и т.д. А функция get() считает строку до разделителя, а не до конца файла.
И поэтому имена переменных для файлов read write неудачны. Добавьте фантазии, назовите их как-то типа FileForRead FileForWrite.

→ Ссылка