Помогите допилить решение задачи С++ запись и чтение с файла
Дан символьный файл А. Переписать в файл В сначала все нечётные его символы, а затем все чётные в обратном порядке.
При записи в файл забивается мусор вперемешку с данными.
#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 шт):
Есть тут немного ошибок. Самая основная - Вы почему-то считаете, что у из файла считается ровно 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.