在C ++中分割大文件 [英] Split a Large File In C++

查看:148
本文介绍了在C ++中分割大文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图写一个程序,它需要一个大文件(任何类型),并将它分成许多较小的块。我想我有基本的想法下来,但由于某种原因,我不能创建一个大小超过12 kb。我知道有几个解决方案在谷歌等,但我更感兴趣的是学习这个限制的起源是什么,然后实际上使用程序来拆分文件。

I'm trying to write a program that takes a large file (of any type) and splits it into many smaller "chunks". I think I have the basic idea down, but for some reason I cannot create a chunk size over 12 kb. I know there are a few solutions on google, etc. but I am more interested in learning what the origin of this limitation is then actually using the program to split files.

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

任何想法?

推荐答案

您正在写入拆分文件,但不是从bigfile读取。你正在写的是bigfile的内存结构,而不是bigfile的内容。你需要分配一个缓冲区,从bigfile中读取它并写入splitfile。

You are writing to the split file, but not reading from the bigfile. What you are writing it the in-memory structure of the bigfile, not the contents of bigfile. You need to allocate a buffer, read into it from bigfile and write it to the splitfile(s).

这篇关于在C ++中分割大文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆