Разделение файлов в C ++ - PullRequest
1 голос
/ 10 февраля 2012

Мне нужно разбить файл на несколько файлов без сжатия.Я нашел это по ссылке cpp

#include <fstream>
using namespace std;

int main () {

char * buffer;
long size;

ifstream infile ("test.txt",ifstream::binary);
ofstream outfile ("new.txt",ofstream::binary);

// get size of file
infile.seekg(0,ifstream::end);
size=infile.tellg();
infile.seekg(0);

// allocate memory for file content
buffer = new char [size];

// read content of infile
infile.read (buffer,size);

// write to outfile
outfile.write (buffer,size);

// release dynamically-allocated memory
delete[] buffer;

outfile.close();
infile.close();
return 0;
}

, и я подумал сделать это так.Но проблема в том, что .. Я могу создать только 1-й файл, потому что я могу читать данные только с начала файла.Можно ли это сделать так, а если нет ... каков наилучший способ разбить эти файлы?

Ответы [ 5 ]

1 голос
/ 10 февраля 2012

Пример кода не разбивает файл на несколько файлов; это просто копирует файл Чтобы разделить файл на несколько файлов, просто не закрывайте вход. В псевдокоде:

open input
decide size of each block
read first block
while block is not empty (read succeeded):
    open new output file
    write block
    close output file
    read another block

Важной частью является не закрытие входного файла, чтобы каждый чтение точно определяет, где закончилось предыдущее чтение.

0 голосов
/ 10 февраля 2012

Я думаю, у меня есть решение вашей проблемы ... Вы читаете все первые файлы в массиве символов. Затем вы записываете первую половину массива в файл, а затем вторую половину массива в другой файл ...

Например:

#include <fstream>
using namespace std;

int main () {

char * buffer;
long size;

ifstream infile ("test.txt",ifstream::binary);
ofstream outfile ("new.txt",ofstream::binary);
ofstream outfile2 ("new2.txt",ofstream::binary);

// get size of file
infile.seekg(0,ifstream::end);
size=infile.tellg();
infile.seekg(0);

// allocate memory for file content
buffer = new char [size];

// read content of infile
infile.read (buffer,size);

// write to outfile
outfile.write (buffer,size/2);
outfile2.write (buffer+size/2,size);

// release dynamically-allocated memory
delete[] buffer;

outfile.close();
infile.close();
outfile2.close();
return 0;
}

Вы также можете прочитать первую половину, написать ее, затем прочитать вторую половину и написать ... Просто посмотрите на это:

int main () {

char * buffer;
long size;
long halfSize;
ifstream infile ("test.txt",ifstream::binary);
ofstream outfile ("new.txt",ofstream::binary);
ofstream outfile2 ("new2.txt",ofstream::binary);

// get size of file
infile.seekg(0,ifstream::end);
size=infile.tellg();
infile.seekg(0);
halfSize = static_cast<int>(floor(size/2));
// allocate memory for file content

buffer1 = new char[halfSize];
buffer2 = new char[size-halfSize];

// read content of infile
infile.read (buffer1,halfSize);
infile.read (buffer2,size-halfSize);

// write to outfile
outfile.write (buffer1,halfSize);
outfile2.write (buffer2,size-halfSize);

// release dynamically-allocated memory
delete[] buffer;
delete[] buffer2;

outfile.close();
infile.close();
outfile2.close();
return 0;
}
0 голосов
/ 10 февраля 2012

Вы можете искать поток в нужной позиции и затем читать поток. Проверьте этот кусок кода.

// get size of file
infile.seekg(0,ifstream::end);
size=infile.tellg();
infile.seekg(0);

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

0 голосов
/ 10 февраля 2012

Зачем изобретать велосипед - Попробуйте split

Даже есть исходный код для вас, чтобы получить идеи, если вы хотите реализовать его в C ++

0 голосов
/ 10 февраля 2012

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

Однако вам не нужно: просто написать цикл для последовательного чтения каждого outputSize и записать его в новый файл, для некоторых outputSize < size.

...