2010-03-29 7 views
7

Büyük bir dosya (herhangi türde) alan ve çok daha küçük "parçalar" halinde bölen bir program yazmaya çalışıyorum. Sanırım temel düşüncem var, ama bir sebepten 12 kb üzerinde bir yığın boyutu oluşturamıyorum. Google, vb. Üzerinde birkaç çözüm bulunduğunu biliyorum. Ancak bu sınırlamanın kaynağının aslında dosyaları bölmek için programın ne olduğunu öğrenmekle daha çok ilgileniyorum.Büyük Dosyayı C + + 'da Bölme

//This file splits are larger into smaller files of a user inputted size. 
#include<iostream> 
#include<fstream> 
#include<string> 
#include<sstream> 
#include <direct.h> 
#include <stdlib.h> 
using namespace std; 

void GetCurrentPath(char* buffer) 
{ 
_getcwd(buffer, _MAX_PATH); 
} 


int main() 
{ 
// use the function to get the path 
char CurrentPath[_MAX_PATH]; 
GetCurrentPath(CurrentPath);//Get the current directory (used for displaying output) 

fstream bigFile; 
string filename; 
int partsize; 
cout << "Enter a file name: "; 
cin >> filename; //Recieve target file 
cout << "Enter the number of bites in each smaller file: "; 
cin >> partsize; //Recieve volume size 

bigFile.open(filename.c_str(),ios::in | ios::binary); 
bigFile.seekg(0, ios::end); // position get-ptr 0 bytes from end 
int size = bigFile.tellg(); // get-ptr position is now same as file size 
bigFile.seekg(0, ios::beg); // position get-ptr 0 bytes from beginning 

for (int i = 0; i <= (size/partsize); i++) 
{ 
    //Build File Name 
    string partname = filename; //The original filename 
    string charnum;  //archive number 
    stringstream out; //stringstream object out, used to build the archive name 
    out << "." << i; 
    charnum = out.str(); 
    partname.append(charnum); //put the part name together 

    //Write new file part 
    fstream filePart; 
    filePart.open(partname.c_str(),ios::out | ios::binary); //Open new file with the name built above 
    //Check if near the end of file 
    if (bigFile.tellg() < (size - (size%partsize))) 
    { 
    filePart.write(reinterpret_cast<char *>(&bigFile),partsize); //Write the selected amount to the file 
    filePart.close(); //close file 
    bigFile.seekg(partsize, ios::cur); //move pointer to next position to be written 
    } 
    //Changes the size of the last volume because it is the end of the file 
    else 
    { 
    filePart.write(reinterpret_cast<char *>(&bigFile),(size%partsize)); //Write the selected amount to the file 
    filePart.close(); //close file 
    } 
    cout << "File " << CurrentPath << partname << " produced" << endl; //display the progress of the split 
} 


bigFile.close(); 
cout << "Split Complete." << endl; 
return 0; 
} 

Herhangi bir fikir?

cevap

4

Bölme dosyasına yazıyorsunuz, ancak büyük dosyadan okuma yapıyorsunuz. Ne yazıyorsun, büyük dosya içeriğinin bellek içi yapısı, büyük dosya içeriğinin değil. Bir arabellek ayırmak, büyük dosyadan okumak ve bölünmüş dosyalara yazmak gerekir.

+0

Tam olarak bu sorun oldu, bu değişiklikler mükemmel bir şekilde çalıştı. Teşekkürler! – wdow88