Если каждая запись всегда 20 байт, вы будете в точности соответствовать 5242880 записям в файле размером 100 МБ (100 * 1024 * 1024).
Таким образом, должно быть довольно очевидно, как это сделать, нет никакого риска повредить запись, если вы всегда читаете и записываете кратность 20 байтов за раз. Так как ваш желаемый размер среза 100 МБ является таким кратным, используйте это. Если вы делаете это на ПК настольного класса или что-то в этом роде, буфер ввода-вывода 100 МБ довольно большой, но не экстремальный.
Итак, вы собираетесь сделать что-то вроде этого:
bool chunkify(const char *filename, size_t chunkSize)
{
void *buffer = malloc(chunkSize);
FILE *in;
bool ok = true;
if (buffer == NULL)
return false;
if ((fin = fopen(filename, "rb")) != NULL)
{
size_t got;
unsigned int count = 0;
while(ok && (got = fread(buffer, 1, chunkSize, fin)) > 0)
{
FILE *fout;
char outname[1024];
snprintf(outname, sizeof outname, "%s-%u", filename, count++);
if ((fout = fopen(outname, "wb")) != NULL)
{
ok &= fwrite(buffer, got, 1, fout);
fclose(fout);
}
}
fclose(fin);
}
free(buffer);
return ok;
}
Примечания: выше не тестировался пол сложного кода I/O означает, как только отправная точка. Вероятно, у вас могут быть ошибки.
Зависит. Каков формат вашего файла? Какой язык - C или C++? Выбери один_. –
'system (" split -b "+ std :: to_string ((100ul << 20)/20 * 20) +" '"+ filename +"' ");' (почему C++) – sehe
Вы не предоставили никаких контекст. Если это одноразовая задача, а не постоянная обязанность выполняться в контексте более крупной программы на C/C++, то это не вопрос C/C++. Предложение dd - лучший ответ, если вы находитесь в системе * nix, и вам не придется писать строку кода. dd может быть даже оптимизирован с небольшим усилием. Я использовал его для перемещения терабайтов для отделов govmint, где быстрая или временная задержка увидела бы меня, что я очень серьезно смотрю на людей, у которых есть подготовка к оружию ... –