2012-03-16 3 views
-3

Как сохранить данные из файла (до указанного размера) в другой файл. Например, если файл A имеет общий размер 10 КБ, я хочу сохранить 3 Кбайта в файле X, а остальные 7 КБ - в другом файле. Как это сделать на C++. Я новичок, так что медведь со мной ..Как разделить файл в соответствии с его размером?

Примечание: Все чтение и запись выполняется в двоичном режиме!

+1

Что вы сделали до сих пор? Где вы боретесь? – karlphillip

ответ

0

Это очень сложно и сложно сделать так. Шаги, чтобы сделать это в любом случае, - это открыть файл в двоичном режиме (зная, что символ - это X-бит, например), подсчитывать символы файла (o = n, если вы не понимаете, что then complex = n, это означает, что для его завершения потребуется N (это число символов)), затем выполните некоторые математические операции над этим числом, затем создайте цикл, который «перемещает» каждого символа в другой файл в цикле, пока не достигнет определенного числа (300, например, 1000 символов). Новый файл будет иметь первые 300, а старый файл будет содержать эти 700 символов. Довольно легко сделать в коде, комментарий просит так что если вы хотите что :)

0

использовать что-то вроде этого:

FILE *f1 = fopen("file1.txt", "rb"); 
// assuming size of f1 to be 10*1024 bytes 
FILE *f2 = fopen("file2.txt", "wb"); 
for(int i=0;i<3*1024;++i) fputc(fgetc(f1),f2); 
fclose(f2); 
FILE *f3 = fopen("file3.txt", "wb"); 
for(int i=0;i<7*1024;++i) fputc(fgetc(f1),f3); 
fclose(f3); 
fclose(f1); 

Конечно, этот код делает много предположений, и вы будете нуждаться для реализации вещей с надлежащим защитным кодом (например, с учетом EOF).

+0

Это ближе к C, чем C++; он также довольно неэффективен, поскольку он копирует данные по одному символу за раз. –

+0

Я согласен, но он сказал, что он был новичком. –

+0

Точно * потому что * он новичок, я постараюсь придумать короткое, но идиоматическое решение. –

2

Если он доступен, вы можете использовать std::copy_n и std::copy вместе с потоком iterators:

std::ifstream input_file; 
std::ofstream output_file_1; 
std::ofstream output_file_2; 

// ... 

auto input_iterator = std::istream_iterator<char>(input_file), 
// Copy 3k to first file 
std::copy_n(input_iterator, 
      3072, 
      std::ostream_iterator<char>(output_file_1)); 

// Copy the remaining to the second file 
std::copy(input_iterator, 
      std::istream_iterator<char>(), 
      std::ostream_iterator<char>(output_file_2)); 
+0

Вы можете запомнить 'istream_iterator' для входного файла в переменной, а затем повторно использовать его (и его текущую позицию!) Во втором вызове' std :: copy', чтобы избежать дублирования '3027'. –

+0

@FrerichRaabe Спасибо, обновил ответ. –