8 Stimmen

Aufteilung einer großen Datei in C++

Ich versuche, ein Programm zu schreiben, das eine große Datei (beliebigen Typs) in viele kleinere "Chunks" aufteilt. Ich glaube, ich habe die Grundidee verstanden, aber aus irgendeinem Grund kann ich keine Stücke mit einer Größe von mehr als 12 kb erstellen. Ich weiß, dass es ein paar Lösungen auf Google usw. gibt, aber ich bin mehr daran interessiert zu erfahren, woher diese Einschränkung kommt, als das Programm tatsächlich zum Teilen von Dateien zu verwenden.

//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;
}

Irgendwelche Ideen?

4voto

florin Punkte 13628

Sie schreiben in die Splitdatei, lesen aber nicht aus der Bigfile. Was Sie schreiben, ist die In-Memory-Struktur der bigfile, nicht der Inhalt der bigfile. Sie müssen einen Puffer zuweisen, in diesen aus der bigfile lesen und ihn in die Splitdatei(en) schreiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X