📄 breakup.cpp
字号:
//: C18:Breakup.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 1999
// Copyright notice in Copyright.txt
// Breaks a file up into smaller files for
// easier downloads
#include "../require.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <strstream>
#include <string>
using namespace std;
int main(int argc, char* argv[]) {
requireArgs(argc, 1);
ifstream in(argv[1], ios::binary);
assure(in, argv[1]);
in.seekg(0, ios::end); // End of file
long fileSize = in.tellg(); // Size of file
cout << "file size = " << fileSize << endl;
in.seekg(0, ios::beg); // Start of file
char* fbuf = new char[fileSize];
require(fbuf != 0);
in.read(fbuf, fileSize);
in.close();
string infile(argv[1]);
int dot = infile.find('.');
while(dot != string::npos) {
infile.replace(dot, 1, "-");
dot = infile.find('.');
}
string batchName(
"DOSAssemble" + infile + ".bat");
ofstream batchFile(batchName.c_str());
batchFile << "copy /b ";
int filecount = 0;
const int sbufsz = 128;
char sbuf[sbufsz];
const long pieceSize = 1000L * 100L;
long byteCounter = 0;
while(byteCounter < fileSize) {
ostrstream name(sbuf, sbufsz);
name << argv[1] << "-part" << setfill('0')
<< setw(2) << filecount++ << ends;
cout << "creating " << sbuf << endl;
if(filecount > 1)
batchFile << "+";
batchFile << sbuf;
ofstream out(sbuf, ios::out | ios::binary);
assure(out, sbuf);
long byteq;
if(byteCounter + pieceSize < fileSize)
byteq = pieceSize;
else
byteq = fileSize - byteCounter;
out.write(fbuf + byteCounter, byteq);
cout << "wrote " << byteq << " bytes, ";
byteCounter += byteq;
out.close();
cout << "ByteCounter = " << byteCounter
<< ", fileSize = " << fileSize << endl;
}
batchFile << " " << argv[1] << endl;
} ///:~
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -